这个题虽然很容易想到动态规划,有存在子结构。仔细一想这个子结构根本不需要数组来缓存,几个变量缓存就够了。
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};
}
};



京公网安备 11010502036488号