【基礎演算法強化】(2)零子陣列
阿新 • • 發佈:2019-02-06
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。