这个题虽然很容易想到动态规划,有存在子结构。仔细一想这个子结构根本不需要数组来缓存,几个变量缓存就够了。
1.以当前位置结尾的累计最大值。
2.全局累计最大值
3.当前位置累计最大值的开始位置跟结束位置。
4.全局累计最大值的开始位置跟结束位置。
更新全局最大值有个约束:
1.当前位置最大值大于全部累计最大值,直接更新(没啥说的)
2.当前位置最大值等于全部累计最大值,更新结束位置跟开始位置间距长度大的那个。
需要处理好两个边界:
边界1:更新当前位置累计最大值时,需包括前一个位置结尾累计最大值为0的情况
边界2:更新全局累计最大值是,需包括当前位置最大值跟累计最大值相等的情况(注意条件是位置间距长度大的才更新)
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型vector * @return int整型vector */ vector<int> FindGreatestSumOfSubArray(vector<int>& array) { // write code here int maxVal = array[0]; int current = maxVal; int start = 0; int end = 0; int finalStart = 0; int finalEnd = 0; if(array.size() == 0){ return array; } for(int i = 1;i < array.size();i++){ if(current >= 0){ current += array[i]; end = i; }else{ current = array[i]; start = i; end = i; } if(current > maxVal || (current == maxVal && ((end - start) > (finalEnd - finalStart)))){ maxVal = current; finalStart = start; finalEnd = end; } } return {array.begin()+finalStart,array.begin()+finalEnd+1}; } };