剑指offer--连续子数组的最大和
三种常见解法:
- 动态规划的思想,首先以array[i]结尾的最大连续子串和max(arrary[i])为:
max(array[i-1])+array[i] or array[i]两者中的较大的那一个。
所以max保存每个数组元素结尾的最大子串和就可以找到最大和是多少。
时间复杂度:O(n)public int FindGreatestSumOfSubArray(int[] array) { if(array == null || array.length == 0) { return 0; } int max = array[0]; int sum = array[0]; for(int i=1;i<array.length;i++) { sum = getMax(sum+array[i], array[i]); if(sum>max) max = sum; } return max; } private int getMax(int i, int j) { if(i>j) return i; return j; }
2.方法二是以上动归的另一种实现,取max(array[i])=取大值(max(array[i-1])+array[i] or array[i]),其实就是max(array[i-1])是否为<0,如果<0那么就是去array[i],否则就是取max(array[i-1])+array[i].
时间复杂度:O(n)
public int FindGreatestSumOfSubArray(int[] array) {
if(array == null || array.length == 0) {
return 0;
}
int max = array[0];
int sum = array[0];
for(int i=1;i<array.length;i++) {
if(sum<0) {
sum = array[i];
}
else {
sum += array[i];
}
if(sum>max) {
max = sum;
}
}
return max;
}
3.最容易想到的暴力遍历解法,两层循环计算每一个元素的结尾的最大和。
public int FindGreatestSumOfSubArray(int[] array) {
if (array == null || array.length == 0) {
return 0;
}
int max = array[0];
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum = 0;
for (int j = i; j >= 0; j--) {
sum += array[j];
if (sum > max) {
max = sum;
}
}
}
return max;
}