LeetCode 🟡 1286. Iterator for Combination
🔗 🟡 1286. Iterator for Combination
tags: Biweekly Contest 15
題意
請你設計一個 Iterator 類別 CombinationIterator
,包含以下內容:
CombinationIterator(string characters, int combinationLength)
一個 Constructor,輸入參數包括:用一個 有序 且字元 不重複 的字符串characters
(該字符串只包含小寫英文字母)和一個數字combinationLength
(以下用 表示)。next()
按 字典序 返回長度為 的下一個字母組合。hasNext()
只有存在長度為combinationLength
的下一個字母組合時,才返回true
,否則返回false
。
約束條件
characters
的所有字母都是 不同 的。- 最多會進行 次 next 和 hasNext 的調用。
- 保證每次調用函數
next
時都存在下一個字母組合。
思路
本題和 31. Next Permutation [🔗解題紀錄] 類似,分別是求解下一個排列和下一個組合。但求解組合其實比求解排列要簡單,因為組合的元素是無序的,因此不用考慮誰先誰後,只需要考慮有哪些元素在組合中。
類似地,由於要找到在所有比當前組合大的組合中,字典序最小的組合,我們應盡可能少修改 nums
前方的元素。換句話說,如果我們可以透過 修改 最後的 個元素,得到更大的排列,那麼在 最小的情況,我們可以得到恰好緊跟在 nums
之後的排列。注意這裡和排列的情況不同,排列的情況由於要使用所有元素,因此只能交換,但這裡能直接修改。
為了知道組合中的元素是集合中的第幾個元素,我們使用一個陣列 來記錄每個元素的下標,若 ,則表示組合中的第 個元素是集合中第 大的元素。
如此便可以確定核心思路,從 開始,依次檢查是否能改變最後 個元素得到更大的排列。
- 不難發現若無法修改,則最後 個元素一定是最大的 個元素。換句話說,當存在某個下標 可以得到更大的組合時, 且 。
- 因此,我們由後往前移動指標 ,直到找到可以第一個修改的元素位置,即 的位置。
接著考慮如何修改 的值,使得組合變大。
- 首先將 ,這樣就保證能得到比當前組合大的組合。
- 之後要使後續的元素盡可能的小,但由於組合是無序的,因此只能添加比 大的元素。在這其中最小的顯然是 。因此可以將 到 的值設定為 ,實作時只需要設定成 即可。
最後,考慮如何確定沒有下一個組合。當遍歷完所有元素,仍無法找到可以修改的元素,則表示當前已經是最大的組合,故不存在下一個組合。
複雜度分析
- 時間複雜度:
next
的時間複雜度:,每次調用next
時,最多需要遍歷 個元素。- 這裡雖然看似是兩重迴圈,但實際上第二個迴圈只有在找到可以修改的元素時才會執行。
hasNext
的時間複雜度:,只需要檢查has_next
的值。
- 空間複雜度:,需要使用 個額外空間來保存字串,以及 的額外空間來儲存組合。
1 | class CombinationIterator: |
1 | class CombinationIterator { |
類題
寫在最後
PROMPT
masterpiece, best quality, high quality, extremely detailed CG unity 8k wallpaper, extremely detailed, High Detail, vibrant colors, backlight, photo background,
1other, solo, no humans, Sylveon, Sylveon (Pokémon), Pokémon, blue eyes, full body, outdoors, sky, day, o, blue sky, grass, grassland, looking up,
A serene hand-drawn scene featuring Sylveon, a Pokémon with flowing ribbons, standing in a vibrant green meadow under a clear blue sky. Its eyes are blue, and its ears are a vibrant shade of pink, while its tail is a lighter shade of gray. The ribbons are gently swaying in the wind, and the art style is soft and painterly, emphasizing tranquility and freedom. Detailed grass in the foreground contrasts with the bright, open sky.
同樣是來自群組,106中央的數學題目。