【LeetCode/LintCode】阿里巴巴面試高頻題:最大子陣列
阿新 • • 發佈:2020-09-15
給定一個整數陣列,找到一個具有最大和的子陣列,返回其最大和。
樣例1:
輸入:[−2,2,−3,4,−1,2,1,−5,3]
輸出:6
解釋:符合要求的子陣列為[4,−1,2,1],其最大和為 6。
樣例2:
輸入:[1,2,3,4]
輸出:10
解釋:符合要求的子陣列為[1,2,3,4],其最大和為 10。
線上評測地址:
演算法
貪心
演算法分析
- 題目要求給定一個整數陣列,找到一個具有最大和的子陣列,返回其最大和。若直接暴力列舉子陣列,時間複雜度需要 O(N2);
- 由於題目要求是子陣列最大和,因此可以利用貪心思想,通過區域性的子陣列最大,進而得到整體的最優解;
- 需要注意貪心的策略不能有後效性;
演算法步驟
- 定義 maxAns 記錄全域性最大值,即結果;sum 記錄當前子陣列的和;
- 初始化: maxAns=Integer.MIN_VALUE; sum=0;
因為陣列可以全為負數,因此maxAns不能直接初始化為0;
- 遍歷整數陣列:
- Sum 累加當前的值;
- 若當前 sum>maxAns ,更新 maxAns=sum;
- 若當前 sum<0 ,表示當前的子陣列和已經為負,累加到後面會使和更小,因此令 sum=0,相當於放棄當前的子陣列,重新開始;
複雜度
- 時間複雜度:O(N),N為陣列長度
- 只需要遍歷一遍陣列就能找到答案;
- 空間複雜度:O(1)
- 只需要用到maxAns和sum兩個變數.
public class Solution { /** * @param nums: A list of integers * @return: A integer indicate the sum of max subarray */ public int maxSubArray(int[] nums) { // maxAns記錄全域性最大值 sum記錄當前子陣列的和 int maxAns = Integer.MIN_VALUE, sum = 0; // 貪心 for (int i = 0; i < nums.length; i++) { sum += nums[i]; maxAns = Math.max(maxAns, sum); sum = Math.max(sum, 0); } return maxAns; } }
更多題解參考:九章演算法官網