leetcode 53. Maximum Subarray(最大子序和)--題解
阿新 • • 發佈:2018-12-11
題目描述
給定一個整數陣列 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; }
執行結果
歡迎各位大神指點