LeetCode_Q53_最大子序和

53. 最大子序和

給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。

進階:
如果你已經實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。

階梯思路

方法1:動態規劃

  • 設數組爲 a[k]a[k] , 0kn10\leq k \leq n-1,最大字段和 X 被定義爲:x=max{jk=ia[k]}0ijn1x= \max \{ \sum_{j}^{k=i} a[k] \}_{0\leq i\leq j \leq n-1}
  • 這種兩端都是變化的問題是很難優化的,最好可以讓一端固定,這樣就會大大簡化分析難度。於是將j暫時從原式子中提取出來,將剩下的命名爲b[j]。
  • b[j]=max{jk=ma[k]}0jn1b[j] = max\{ \sum_{j}^{k=m}{a[k]} \}_{0\leq j\leq n-1}x=max{b[j]}0jn1x=max \{ b[j] \}_{0\leq j \leq n-1}
  • b[j]b[j] 就是 以 a[i]a[i] 結尾的最大字段和,所以有:b[j]=max{b[j1]+a[j],a[j]}b[j] = max\{ b[j-1]+a[j],a[j]\}

Code(Java)

	class Solution {
		public int maxSubArray(int[] nums) {
			int[] dp = new int[nums.length];
			dp[0] = nums[0];
			int max = dp[0];
			for (int i = 1; i < nums.length; i++) {
				dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
				if (dp[i] > max)
					max = dp[i];
			}
			return max;
		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章