连续子数组的最大和(二)
题目要求:
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,找到一个具有最大和的连续子数组。
1.子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
2.如果存在多个最大和的连续子数组,那么返回其中长度最长的,该题数据保证这个最长的只存在一个
3.该题定义的子数组的最小长度为1,不存在为空的子数组,即不存在[]是某个数组的子数组
4.返回的数组不计入空间复杂度计算
题解:
题目有两个要求:
- 计算并记录最大数组的和
- 记录最大数组和的数组起始位置和终止位置
关键:
- 用dp数组来存储到题解数组的每个元素的最大数组和
- 用maxsum变量来存储最大数组和
- 用left、right变量来记录滑动数组的起始位置和目标位置(也就是正在计算和的数组的起始位置和终止位置)
- 用resl、resr变量来记录当前最大数组和的最长数组的起始位置和终止位置
- 如果dp数组存储的数组和大于maxsum,或者等于maxsum并且长度大于当前存储的最大数组和的最长数组,则更新resl、resr和maxsum的值
- 如果当前的元素值加上之前的数组和,说明前面的数组和为负数,最大数组和应该从当前元素重新开始,所以dp[i]的值应该是当前元素的值,并且left=i;
解题代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindGreatestSumOfSubArray(vector<int>& array) {
// write code here
vector<int> dp(array.size(),0);
int left=0,right=0,resl=0,resr=0;
dp[0]=array[0];
int maxsum=array[0];
for(int i=1;i<array.size();i++){
right++;
dp[i]=max(dp[i-1]+array[i],array[i]);
if(dp[i-1]+array[i]<array[i]){
left=i;
}
//如果加上i的值大于最大值或者等于最大值但是长度大于最大数组的长度
if(dp[i]>maxsum || (dp[i]==maxsum && (right-left)>(resr-resl))){
maxsum=dp[i];
resl=left;
resr=right;
}
}
vector<int> resarray(array.begin()+resl,array.begin()+resr+1);
return resarray;
}
};