1. 程式人生 > >leetcode 53. Maximum Subarray(最大子序和)--題解

leetcode 53. Maximum Subarray(最大子序和)--題解

題目描述

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

示例

輸入:[-2, 1, -3, 4, -1, 2, 1, -5, 4]

輸出:6

解釋:連續子陣列 [4, -1, 2, 1] 的和最大,為 6。

解題思路

傳統的方法無外乎就是暴力檢索,需要用到兩層甚至三層迴圈,這裡不在贅述。

我們需要額外的空間來儲存每一個i對應元素之前的最大子序和,並且用一個變數來儲存最大子序和,這樣就能在遍歷一次陣列的情況下獲取到最大子序和。

具體方法是,如果原陣列長度是1,則直接返回首元素;如果大於1,對額外空間的陣列result及變數max進行初始化,result[0] = nums[0],max = nums[0],從第2個位置開始遍歷,每一步先將nums[i]賦值給result[i],然後對result的前一元素進行判斷,如果前一元素大於0,則當前result元素變為二者之和,再對max進行判斷,如果result當前元素大於max,則替換。最後返回max即可。

程式碼

public int maxSubArray(int[] nums) {
    int n = nums.length;
    if (n == 1) return nums[0];// 陣列長度為1時直接返回
    int[] result = new int[n];// 定義一個結果陣列存取以索引結尾的最大子陣列之和
    result[0] = nums[0];// 結果陣列第一個數是原陣列第一個元素
    int max = nums[0];// 儲存最大值的變數,初始化為原陣列第一個元素
    for (int i = 1; i < n; i++) {
        // 先將原陣列對應元素賦值到結果陣列對應位置
        result[i] = nums[i];
        // 當結果陣列前一位置值大於0時,當前位置即為二者之和
        if (result[i - 1] > 0) result[i] = result[i] + result[i - 1];
        // 當前元素子陣列之和大於max時進行替換
        if (result[i] > max) max = result[i];
    }
    return max;
}

執行結果  

歡迎各位大神指點