输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
思路
以上面示例为例,和最大的子数组为[4, -1, 2, 1],左右边界分别对应数组中的下标3, 6,所以最大和就为 ;
所以前n项累计和的最大差值便就是子数组最大的和
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// 边界判断
if(nums.size()== 1) return nums[0];
int sum= 0;
int min= 0;
int max= 0x80000000;
int size= nums.size();
for(int i= 0; i< size; i++){
sum+= nums[i];
if(sum- min> max)
max= sum- min;
// 更改最小和
if(min> sum)
min= sum;
}
return max;
}
};
参考Leetcode题解敲了个动态规划版本的,详细解释可以参考原链接
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// 边界判断
if(nums.size()== 1) return nums[0];
int max= nums[0];
int size= nums.size();
for(int i= 1; i< size; i++){
nums[i]+= nums[i- 1]> 0? nums[i- 1]: 0;
max= nums[i]> max? nums[i]: max;
}
return max;
}
};