- 论坛徽章:
- 0
|
本帖最后由 江南书匠 于 2012-06-23 16:54 编辑
不才,也小写了一段代码,耗时远不止8分钟
思路和前面各位差不多,也没想到更好的方法,时间复杂度O(n),空间复杂度O(n).- #include <cstdlib>
- #include <iostream>
- #include <ctime>
- #include <cmath>
- using namespace std;
- #define N 16 // The length of the array
- int intCmp(const void *p, const void *q)
- {
- return (*(int *)p - *(int *)q);
- }
- void findTheLeastGap(int *pArr1, int *pArr2)
- {
- int *pArr3 = new int[2 * N];
- int i, j1, j2;
- qsort((void *)pArr1,(size_t)N, sizeof(int), intCmp); // sort the array
- qsort((void *)pArr2, (size_t)N, sizeof(int), intCmp);
- for (i = 0, j1 = 0, j2 = 0; i < 2 * N; i++) // merge the arrays to the temp array
- {
- if ((j1 == N)
- || ((j2 != N) && (pArr1[j1] > pArr2[j2])))
- {
- pArr3[i] = pArr2[j2];
- j2++;
- }
- else
- {
- pArr3[i] = pArr1[j1];
- j1++;
- }
- }
- int cnt1 = 0, cnt2 = 0;
- for (i = 0, j1 = 0, j2 = 0; (i < 2 * N) && (j1 <N) && (j2 < N); i+=2) // adjust the array one by one
- {
- if (cnt1 == cnt2)
- {
- pArr1[j1++] = pArr3[i];
- pArr2[j2++] = pArr3[i + 1];
- cnt1 += pArr3[i];
- cnt2 += pArr3[i + 1];
- }
- else if (((cnt1 > cnt2) && (pArr3[i] > pArr3[i + 1]))
- || ((cnt1 < cnt2) && (pArr3[i] < pArr3[i + 1])))
- {
- pArr1[j1++] = pArr3[i + 1];
- pArr2[j2++] = pArr3[i];
- cnt1 += pArr3[i + 1];
- cnt2 += pArr3[i];
- }
- else
- {
- pArr1[j1++] = pArr3[i];
- pArr2[j2++] = pArr3[i + 1];
- cnt1 += pArr3[i];
- cnt2 += pArr3[i + 1];
- }
- }
-
- cout<<"The least gap is "<<abs(cnt1 - cnt2)<<endl;
- delete []pArr3;
- }
- int main()
- {
- srand((unsigned)time(NULL)); // seed for generating the array
-
- int *pArr1 = new int[N];
- int *pArr2 = new int[N];
- for (int i = 0; i < N; i++)
- {
- pArr1[i] = rand() & 0xff;
- }
-
- for (int i = 0; i < N; i++)
- {
- pArr2[i] = rand() & 0xff;
- }
- cout<<"The initial array: "<<endl;
- cout<<"Array1:"<<endl;
- for(int i = 0; i < N; i++)
- cout<<pArr1[i]<<" ";
- cout<<endl;
-
- cout<<"Array2:"<<endl;
- for(int i = 0; i < N; i++)
- cout<<pArr2[i]<<" ";
- cout<<endl;
- findTheLeastGap(pArr1, pArr2);
- cout<<"After adjustment: "<<endl;
- cout<<"Array1:"<<endl;
- for(int i = 0; i < N; i++)
- cout<<pArr1[i]<<" ";
- cout<<endl;
- cout<<"Array2:"<<endl;
- for(int i = 0; i < N; i++)
- cout<<pArr2[i]<<" ";
- cout<<endl;
- delete []pArr1;
- delete []pArr2;
-
- system("pause");
- return 0;
- }
复制代码 |
|