1. 程式人生 > 實用技巧 >【LeetCode/LintCode】阿里巴巴面試高頻題:最大子陣列

【LeetCode/LintCode】阿里巴巴面試高頻題:最大子陣列

給定一個整數陣列,找到一個具有最大和的子陣列,返回其最大和。

樣例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。

線上評測地址:

LintCode 領釦

演算法

貪心

演算法分析

  • 題目要求給定一個整數陣列,找到一個具有最大和的子陣列,返回其最大和。若直接暴力列舉子陣列,時間複雜度需要 O(N2);
  • 由於題目要求是子陣列最大和,因此可以利用貪心思想,通過區域性的子陣列最大,進而得到整體的最優解;
  • 需要注意貪心的策略不能有後效性;

演算法步驟

  1. 定義 maxAns 記錄全域性最大值,即結果;sum 記錄當前子陣列的和;
  2. 初始化: maxAns=Integer.MIN_VALUE; sum=0;

因為陣列可以全為負數,因此maxAns不能直接初始化為0;

  1. 遍歷整數陣列:
  • 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;
    }
}

更多題解參考:九章演算法官網