题目:
第一反应是动态规划,但是时间复杂度为O(n)。想到了如果遇到负数就结算,(错误,当前遇到的是负数不一定就代表了之后不会给和带来增加,当前-4很可能之后就加上了8)但是怎么都没办法往下进行,参考了题解。
分析:当前面的子向量的和为负数时,无论当前遍历到的是正数还是负数,都不能使得所求和增大,此时结算当前子向量和之前的最大值结果,并将当前子向量的结果置为0。重新开始相加,遇到负数直接结算。
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
int max = array[0];
int tmp = array[0];
for (int i = 1; i <array.length ; i++) {
if(tmp<0) {
tmp=0;
}
tmp += array[i];
max = Math.max(tmp,max);
}
return max;
}
}