前言
這題是一個經典的動態規劃問題,目標是找到一個陣列中連續子陣列的合還有回傳最大值,時間複雜度可達 O(n)
,這裡有 JAVA 和 Python 的寫法。
題目
Given an integer array
nums
, find the subarray with the largest sum, and return its sum.
給定一個整數陣列
nums
,找到最大總合的子陣列,然後回傳子陣列的總合。
題目連結:https://leetcode.com/problems/maximum-subarray/
題目限制
1 <= nums.length <= 105
104 <= nums[i] <= 104
範例
1 | Input: nums = [-2,1,-3,4,-1,2,1,-5,4] |
1 | Input: nums = [1] |
1 | Input: nums = [5,4,-1,7,8] |
思路&筆記
直觀的做法是把元素依依累加下去,這也代表為連續的子陣列,然後再將這個子陣列相加的最大數存起來。
- 遍歷索引累加下去,子陣列的合會越來越大,代表此子陣列的合上限一直在增加。(這樣可以確保當前子陣列的總合是連續的,且是最大的值)
- 再來比較子陣列的合跟最大值,更新到最大的值。
- 後續要判斷相加的合如果小於 0 的話,重新找子陣列的起點,再依依累加下去。
- 因為子陣列的合為負數,表示對後續的合沒有貢獻,將其重置為 0。(假如是負數的話對於子陣列的合會被扣掉)
JAVA 實現
1 | class Solution { |
Python 實現
使用了和 Java 一樣的邏輯執行,換成 Python 的寫法。
1 | class Solution: |
成績
Language | Runtime | Memory |
---|---|---|
Java | 1ms | 59.1MB |
Python | 719ms | 30.6MB |