思路
類似於這種可分成子問題的問題,且子問題不相同的情況,一般使用動態規劃。本題要求連續的子序列的最大和,那麼就想到設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;
// }
}