思路
类似于这种可分成子问题的问题,且子问题不相同的情况,一般使用动态规划。本题要求连续的子序列的最大和,那么就想到设dp[i]为以num[i]结尾的连续子序列的最大长度,这样再进行递推公式的推导。因为要求的最大长度且题目中说明数组中有正有负,所以若dp[i-1]小于等于0,则dp[i-1]肯定不会是最大和,那么他的价值则不如直接的num[i]了,所以此时直接将num[i]赋给dp[i]。若dp[i-1]大于0,则dp[i]=dp[i-1]+num[i];这个样就可以连续算出以每个num为结尾的连续子序列的最大和,然后去其中最大即可。初始化dp[0]=num[1];
代码
class Solution {
public int maxSubArray(int[] nums) {
int dp[]=new int[nums.length];
dp[0]=nums[0];
for(int i=1;i<nums.length;i++){
if(dp[i-1]<=0){
dp[i]=nums[i];
}else{
dp[i]=dp[i-1]+nums[i];
}
}
int max=nums[0];
for(int i:dp)
max=max>i?max:i;
return max;
}
// public int maxSubArray(int[] nums){
// int sum=nums[0];
// int max=sum;
// if(nums.length==1) return sum;
// for(int i=1;i<nums.length;i++){
// if(sum<=0) sum=nums[i];
// else sum+=nums[i];
// max=max>sum?max:sum;
// }
// return max;
// }
}