输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
图解
类似思路考虑:斐波那契,青蛙跳台阶
class Solution {
public int maxSubArray(int[] nums) {
//f(i) = Max(f(i-1)+nums[i],f(i-1));
int len = nums.length;
if(len == 0){
return 0;
}
int[] dp = new int[len];
dp[0] = nums[0];
int max = dp[0];
for(int i = 1;i< len;i++){
dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
max = Math.max(max,dp[i]);
}
return max;
}
}
//滚动数组优化
class Solution {
public int maxSubArray(int[] nums) {
//f(i) = Max(f(i-1)+nums[i],f(i-1));
int len = nums.length;
if(len == 0){
return 0;
}
int pre = nums[0];
int max = pre;
for(int i = 1;i< len;i++){
pre = Math.max(pre+nums[i],nums[i]);
max = Math.max(max,pre);
}
return max;
}
}