定义状态
dp[i]:到nums[i]结尾(算上nums[i])的连续数组的最大和
maxSum:连续数组的最大和
初始化状态
dp[i] = nums[i]:对应每个索引位置的数
maxSum:nums.length>=2,Math.max(dp[i-1]+nums[i], dp[i])
状态转移
从1开始遍历,当dp[i-1]+nums[i] > dp[i]时,dp[i]= dp[i-1]+nums[i]。maxMoney = Math.max(maxSum, dp[i])。
class Solution {
public int maxSubArray(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
if (n == 1){
return nums[0];
}
int maxSum = nums[0];
dp[0] = nums[0];
for (int i = 1; i < n; i++){
dp[i] = nums[i];
if (dp[i-1]+nums[i] > dp[i]){
dp[i] = dp[i-1]+nums[i];
}
maxSum = Math.max(maxSum, dp[i]);
}
return maxSum;
}
}
官方解答:
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0, maxAns = nums[0];
for (int x : nums) {
pre = Math.max(pre + x, x);
maxAns = Math.max(maxAns, pre);
}
return maxAns;
}
}