题解 | 连续子数组的最大和(二)
连续子数组的最大和(二)
https://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindGreatestSumOfSubArray(vector<int>& array) {
// write code here
if(array.empty()) return array;
int l = 0, r = 0, cur = 0, sum = array[0];
for(int i = 0; i < array.size(); ++i){
if(cur<0){
if(cur<array[i])
l = i;
cur = 0;
}
cur += array[i];
if(cur>=sum){
r = i;
sum = cur;
}
}
//return vector<int>{array.begin()+l, array.begin()+r+1};
//通过 vector 的构造函数一次性完成元素拷贝,内存分配更高效,避免多次扩容
vector<int> ans;
for(int i = l; i <= r; ++i){
ans.push_back(array[i]);
}
return ans;
}
};
很容易想到分治,递归左右最小的,然后发现只往一个方向看的话后面的总归会包括前面的反方向的子串,因此考虑dp。
然后发现题目要求空间复杂度O(1),那么只保存当前的情况和总的左右边界也可以。
注意负数时左边界的变化情况,不能完全等同不要前面和左边界变化,还要比较两者大小(虽然为负数但是比当前好)。
当然负数是越少越好,符合正数时的考虑情况。
其他注意事项见注释。
时间复杂度O(n)。
查看10道真题和解析