算法原型——子數組最大和(Array DP)

題目描述

求一個數組的子數組最大和
例如[3,-2,1,6,-9,1,2,3]
那么這個數組的子數組最大和為8[3,-2,1,6]
[leetcode53]https://leetcode.com/problems/maximum-subarray/

思路:

  1. 首先當然可以暴力的使用兩層循環找到這個最大的子數組,但是太費時間了。
  2. 動態規劃來求解

算法流程

  1. 使用兩個變量cur和res,cur代表求解過程中的一個臨時變量,代表累加到當前位置的一個片段最大,res代表全局的最大,實時更新。
  2. 遍歷數組,cur為數組元素的累加和,如果cur<0,先把cur置為0,然后cur加上當前位置元素,并比較cur和res的大小,更新res。遍歷結束后返回res即可。

算法原理

思考位置i,如果在位置i cur大于0,證明你從i位置開始的最大和肯定沒有從i之前開始的大,假如你cur<0了,那么從i 開始肯定比從i之前開始大,因為你前綴為負數,為何不直接丟棄前綴呢。所以有了我們算法的更新策略。

代碼

public class Solution {
    public int maxSubArray(int[] nums) {
        if(nums==null||nums.length==0)
            return 0;
        int cur=nums[0];
        int res=nums[0];
        for(int i=1;i<nums.length;i++){
            cur=cur<0?0:cur;
            cur+=nums[i];
            res=Math.max(cur,res);
        }
        return res;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容