LeetCode之連續子數組的最大和

題目描述

在數組中找到連續的子陣列(包含至少一個數字),其數量最大。例如:給一個數組{-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

Java代碼

 

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);
    }
}
相關文章
相關標籤/搜索