LeetCode 🟡 846. Hand of Straights
🔗 🟡 846. Hand of Straights 1565
tags: Weekly Contest 87
貪心(Greedy)
雜湊表(Hash Table)
排序(Sorting)
題意
給定一個長度為 的陣列 ,其中 代表第 張牌上的數值,以及一個整數 ,如果可以將這些牌重新排列成若干組,使每組的大小為 ,而且每組包含 張連續的牌,則返回 ,否則返回 。
約束條件
思路:貪心(Greedy) + 雜湊表(Hash Table) + 排序(Sorting)
基於貪心思路,由於我們需要組成連續的牌,因此手牌中最小的牌必會是一組連續牌的起點。假設手牌中最小的牌為 ,則我們需要組成 這 張牌。
因此我們可以使用一個 雜湊表(Hash Table) 來記錄每張牌的數量,並且對其鍵值進行排序(或是使用 C++
的 map
)來確保我們能夠從最小的牌開始檢查連續性。
具體步驟如下:
- 使用
Counter
或map
來統計每張牌的數量,並依照鍵值排序。 - 遍歷排序後的鍵值,對每張牌進行檢查,如果該牌的數量為 ,則跳過。否則則嘗試組成以這張牌為起點的連續組合,共需要組成 組連續牌的集合。
- 如果某張牌無法組成連續組合(即該組內的某張牌的剩餘數量小於需要的數量),則返回 。
- 每次成功組成一個連續組合後,減少相應牌的數量。
- 如果所有牌都能成功組成連續組合,則返回 。
複雜度分析
- 時間複雜度:
- 統計每張牌的數量需要 時間。
- 排序需要 時間,其中 為不同的牌的個數,可以視為 。
- 每張牌最多會被遍歷一次,因此處理所有牌的過程需要 時間,可以視為 。
- 空間複雜度: ,忽略排序的空間複雜度。
1 | class Solution: |
1 | class Solution { |
類題
- 🟡 1296. Divide Array in Sets of K Consecutive Numbers 1490
和本題完全相同,只是敘述上的差異。
寫在最後
Cover photo is generated by @ゴリラの素材屋さん, thanks for their work!
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus