LeetCode精選TOP面試題53.最大子序和

題目描述

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

example:
input  : -2,1,-3,4,-1,2,1,-5,4
output : 6
note   : 連續子數組 [4,-1,2,1] 的和最大,爲 6

解題思路

思路1

動態規劃 – 時間複雜度O(N), 空間複雜度O(1)

  • (1)從下標1開始遍歷數組,當前元素item的前一個元素pre若大於0,則item更新爲item+pre,否則繼續遍歷。
  • (2)在遍歷過程中比使用Math.max(max, item)函數對比當前最大值和item值的大小以確定最終的最大和。
    思路2

貪心算法 – 時間複雜度O(N), 空間複雜度O(1)

  • 若當前元素之前的元素序列之和小於0,則捨棄這個“和”
  • 定義temp用於比較“當前元素”與“當前元素之前的元素序列之和”誰更大
    思路3

分治法 – 時間複雜度O(N), 空間複雜度O(logN)
這個思路是查看官方題解才瞭解的,並不是最優的算法,最優算法依然是動態規劃,但是並沒有理解透徹,所以就不在這裏做不準確的解釋了。詳細內容請到Leetcode官方題解中學習。

代碼(Java)

思路1代碼

public class Solution2 {
    public int maxSubArray(int[] nums){
        int max = nums[0];
        for (int i = 1; i < nums.length; i++){
            if (nums[i-1] > 0){
                nums[i] += nums[i-1];       // 當前元素item[i]的前驅元素item[i-1]>0,更新當前元素的值
            }
            max = Math.max(nums[i], max);   // 確定目前爲止的最大值
        }

        return max;
    }
}

思路2代碼

public class Solution {
    public int maxSubArray(int[] nums){
        int temp = nums[0];
        int max = nums[0];
        for (int i = 1; i < nums.length; i++){
            temp = Math.max(nums[i], temp + nums[i]); // 等價於比較“當前元素”與“當前元素之前的元素序列之和”誰更大
                                                      // temp = Math.max(0, temp);
            max = Math.max(temp, max);                // 確定臨時最大值
        }
        return max;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章