LeetCode 🔴 330. Patching Array
🔗 🔴 330. Patching Array
tags: 貪心(Greedy)
排序(Sorting)
歸納法(Induction)
題意
給定一個 已排序 的正整數陣列 和一個正整數 ,從 區間內選取任意個數字補充到 中,使得 區間內的任何數字都可以用 中某幾個數字的和來表示。
請返回最小需要補充的數字個數。
思路:歸納法(Induction) + 貪心(Greedy)
由小到大構造目標數,令 表示當前可以構造的最大值,且將 也視為可以構造的數,即 區間內的所有整數都可以構造出來,則 為下一個要構造的值。
若當前可以構造的數範圍是 ,在此基礎上若新增一個數 ,則可構造出 。
- 若 ,則兩區間存在重疊,合併後可構造的範圍為 。
- 若 ,則兩區間洽連續,也可合併成 。
- 若 ,則兩區間不連續,無法構造出 中的所有整數,此時需要補充 這個數,補充後可以構造出 中的所有整數。
複雜度分析
- 時間複雜度:,其中 是 的長度。
- 遍歷 的時間複雜度為 。
- 每次補充數字後, 可以增加一倍,因此最多補充 次。
- 空間複雜度:
1 | class Solution: |
1 | class Solution { |
類題
- 🟡 1798. Maximum Number of Consecutive Values You Can Make 1931
能夠構造的最大值,因此不用補充數字。 - 🟡 2952. Minimum Number of Coins to be Added 1784
只差在沒有事先排序。
寫在最後
Cover photo is generated by @たろたろ, thanks for their work!
這題雖然是 Hard ,但重新出現時已經變成 Medium 了,一個套路被熟悉了就是這樣。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus