1. 程式人生 > >【基礎演算法強化】(2)零子陣列

【基礎演算法強化】(2)零子陣列

1.對於長度為N的陣列A,求子陣列的和接近0的子陣列,要求時間複雜度為O(NlogN)

思路:
1.申請累積和陣列sum[i],定義sum[-1]=0;
2.∑Ak=sum(j)-sum(i-1);
3.對sum陣列排序,計算相鄰元素差值,其中最小值記為min_1;
4.sum陣列中最小值記為min_2
5.return min(min_1,min_2);

實現程式碼如下:

#include <iostream>
#include <algorithm>
using std::cout;
using std::endl;
using std::min;
using
std::abs; class Solution{ public: void sum_to_zero(int *array, int len){ int *sum = new int[len]; int i; int j; if (sum != NULL){ sum[-1] = 0; for (i = 0; i < len; ++i){ sum[i] = sum[i - 1] + array[i]; } //排序操作 int min_1 = sum[0]; for
(i = 0; i < len-1; ++i){ for (j = i+1; j < len; ++j){ if (sum[i] < sum[j]){ int temp = sum[i]; sum[i] = sum[j]; sum[j] = temp; } } } for (i = 0; i < len; ++i){ printf
("%d ",sum[i]); } printf("\n"); for (i = 0; i < len; ++i){ int dist = sum[i] - sum[i - 1]; if (abs(dist) < abs(min_1)){ min_1 = dist; } } int min_2 = sum[0]; for (i = 0; i < len; ++i){ if (abs(sum[i]) < abs(min_2)){ min_2 = sum[i]; } } cout << min(min_1, min_2) << endl; } return; } }; int main() { int obj_array[9] = { -13, 7,-14, 15, -6, 17, 10, -11, -4 }; int len = sizeof(obj_array) / sizeof(int); Solution p; p.sum_to_zero(obj_array, len); system("pause"); return 0; }

演算法中用到了技巧sum[-1]=0;但是由於在Heap上開闢了記憶體空間,因此如果直接呼叫delete []sum;會出現堆空間釋放錯誤,這裡是個待解決的BUG。