LeetCode劍指offer Q42連續子數組的最大和

思路

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

    // }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章