LeetCode 🟡 881. Boats to Save People
🔗 🟡 881. Boats to Save People 1530
tags: Weekly Contest 96
貪心(Greedy)
排序(Sorting)
雙指標(Two Pointers)
題意
給定一個陣列 ,其中 是第 個人的重量,還有無限數量的船,每艘船能承載的最大重量是 。
每艘船最多同時載兩個人,前提是這兩個人的總重量不超過 。
返回承載所有人所需要的最少船數。
思路:貪心(Greedy) + 排序(Sorting) + 雙指標(Two Pointers)
首先確定思路,對於某個體重為 的人,我們希望找到另一個體重為 的人,使得 ,這樣我們就可以將這兩個人放在同一艘船上。在固定 的情況下,為了使船的數量最少,我們希望 的體重 越大越好 ,這樣才能保證在滿足限重的情況下,盡可能多地載人。
基於這個 貪心(Greedy) 思路,可以將所有人按照體重進行排序,然後使用雙指針的方法,一個指針 指向最輕的人,另一個指針 指向最重的人。
- 如果這兩個人的重量和小於或等於 ,我們可以將他們安排在同一艘船上,然後移動兩個指針, 增加 , 減少 。
- 如果這兩個人的重量和大於 ,我們只能將較重的那個人單獨安排在一艘船上,然後只移動 指針, 減少 。
無論哪種情況,每次迭代後,我們都需要增加船的數量。最終,當 時,表示已經處理完所有人,我們便找到了所需的最少船數。
複雜度分析
- 時間複雜度:排序需要 的時間,雙指針掃描需要 的時間,因此總時間複雜度為 。
- 空間複雜度:排序過程所需的空間是 。
1 | class Solution: |
1 | class Solution { |
寫在最後
Cover photo is generated by @ゴリラの素材屋さん, thanks for their work!
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus