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