在數組中找到連續的子陣列(包含至少一個數字),其數量最大。例如:給一個數組{-2,1,-3,4,-1,2,1,-5,4},連續的子序列[4,1,2,1]具備最大的和= 6。數組
當咱們從頭至尾遍歷這個數組的時候,對於數組裏的一個整數,它有兩種選擇:一、加入以前的SubArray;二、本身另起一個SubArray。測試
若是以前的SubArray的整體的和大於0的話,咱們認爲其對後續結果是有貢獻的。這種狀況下咱們選擇加入以前的SubArray。spa
若是以前的SubArray的整體和爲0或者小於0的話,咱們認爲其對後續結果是沒有貢獻的,甚至是有害的(小於0時)。這種狀況下咱們選擇以這個數字開始,另起一個SubArray。code
設狀態爲f[j],表示以S[j]結尾的最大連續子序列和,則狀態轉移方程以下:blog
$f[j]=max{f[j-1]+S[j],S[j]}$,其中1≤j≤nget
target=max{f[j]},其中1≤j≤nit
package dynamicPlanning; /** * Created by Feng on 2017/9/11. */ public class MaximumSubarray { public int maxSubArray(int[] nums) { int result = Integer.MIN_VALUE; int max = 0; for (int i = 0; i < nums.length; i++) { max = Math.max(max + nums[i], nums[i]); result = Math.max(result, max); } return result; } }
測試代碼:io
package dynamicPlanning; import org.junit.Test; /** * Created by Feng on 2017/9/11. */ public class MaximumSubarrayTest { MaximumSubarray maximumSubarray = new MaximumSubarray(); @Test public void maxSubArray() throws Exception { int[] nums = {6, -3, -2, 7, -15, 1, 2, 2}; int result = maximumSubarray.maxSubArray(nums); System.out.println(result); } }