题目:
输入一个整形数组,数组里有整数也有负数。
数组中连续的一个或多个整数组成一个字数组,每个字数组都有一个和。
求所有字数组的和的最大值。要求时间复杂度为O(n)。
例如:
输入数组:1,-2, 3, 10,-4, 7, 2,-5
其最大的子数组为3, 10,-4 ,7 ,2
输出:18
思路:
贪心算法,从左到右进行扫描求和,若得到的和比存储的最大值要大,则需要更新最大值;若得到的和为负,则把前面的字数组和舍弃,把和置为0
重点:
若得到的和为负,则把前面的字数组和舍弃,把和置为0。这个该如何理解?
个人观点,前面的字数组和为负值,若继续添加元素,只会对潜在的最大值产生负面影响;而若前面的字数组和为正值,若继续添加元素,只会对潜在的最大值产生正面影响。
假设,S2为潜在的最大和的字数组,S1为S2前面的字数组。S1---S2
若S1<0,则S1+S2<S2,所以应该舍弃S1,和清零。
若S1>0,则S1+S2>S2,所以S2必定不是最大和的字数组,最大和的字数组为S1---S2
C++代码:
int maxSubarray(int *a, int size){
if (size <= 0){
cout << "ERROR ARRAY SIZE" << endl;
return -(1<<31);
}
int sum = 0;
int max = -(1 << 31);//max初始化为int的最小值
int sum = 0;
int cur = 0;
while (cur < size){
sum += a[cur++];
if (sum>max){
max = sum;
}
else if (sum < 0){
sum = 0;
}
}
return max;
}