一、题目
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
点击查看原题
难度级别:简单
二、思路
1)动态规划
可以将问题抽象出来,dp[i]
表示以i
位置数字结尾的连续子数组最大和的值,那么dp[i+1]
的值只依赖于dp[i]
,其中:
若dp[i]<0,则dp[i+1]=nums[i+1]
若dp[i]>0,则dp[i+1]=nums[i+1]+dp[i]
记录dp
数组中最大的值,就为本题答案
由于后一个状态只依赖于前一个状态,可以将其空间复杂度优化为常数,使用preSum
代表dp[i]
即可
三、代码
1)动态规划
class Solution {
public int maxSubArray(int[] nums) {
int ans = Integer.MIN_VALUE;
int preSum = 0;
for (int num : nums) {
if (preSum < 0) {
preSum = num;
} else {
preSum += num;
}
ans = Math.max(preSum, ans);
}
return ans;
}
}
时间复杂度为O(n)
,空间复杂度为O(1)