难度:简单
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为 O(n)
。
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:
注意:本题与 53. 最大子数组和 相同。
定义 dp
数组, dp[i]
代表以元素 nums[i]
为结尾的连续子数组最大和。
dp[i−1] < 0
,说明 dp[i−1]
对 dp[i]
产生负贡献,即 dp[i−1]+nums[i]
还不如 nums[i]
本身大。
dp[i−1]>=0
时,执行:dp[i−1]<0
时,执行 :dp[0]=nums[0]
,即以 nums[0]
结尾的连续子数组最大和为nums[0]
。优化:
dp[i]
只与 dp[i−1]
和 nums[i]
有关系,因此可以第一个变量 sum
存储 dp[i]
的值,即存储以元素 nums[i]
为结尾的连续子数组最大和。dp
列表使用的额外空间,因此空间复杂度从 O ( n ) O(n) O(n) 降至 O ( 1 ) O(1) O(1)。C++
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = nums[0];
int sum = 0;
for(int num : nums){
sum = sum < 0 ? num : sum + num;
ans = max(ans, sum);
}
return ans;
}
};
Java
class Solution {
public int maxSubArray(int[] nums) {
int ans = nums[0];
int sum = 0;
for(int num : nums){
sum = sum < 0 ? num : sum + num;
ans = Math.max(ans, sum);
}
return ans;
}
}
n
为数组 nums
的长度,我们只需要遍历一遍数组即可求得答案。题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!