题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
思路
- 动态规划:设
dp[i]
为以下标为 i 的数结尾的连续子数组的最大和
,相当于以每个数作为结尾进行遍历,而由于dp[i]
可以由dp[i-1]
加一个数得到,所以得到状态转移方程
dp[i]=max(dp[i-1]+nums[i],nums[i])
,这里取较大值是因为nums
中存在负数或者全为负数的极端情况,可能dp[i-1] < 0
或者两者都为负数的情况,所以要取较大值。
答案即为所有dp[i]
的最大值。
由于dp[i]
只和dp[i-1]
有关,可以用一个变量不用数组存储。
class Solution {
public int maxSubArray(int[] nums) {
int l=nums.length;
int pre=0;
int res=nums[0];
for(int i=0;i<l;i++){
pre=Math.max(nums[i],pre+nums[i]);
//每次循环存储最大值
res=Math.max(res,pre);
}
return res;
}
}