LeetCode 🟡 2501. Longest Square Streak in an Array
🔗 🟡 2501. Longest Square Streak in an Array 1480
tags: Weekly Contest 323
陣列(Array)
二分搜尋(Binary Search)
排序(Sorting)
雜湊表(Hash Table)
動態規劃(Dynamic Programming)
題意
給定一個整數陣列 。如果 的子序列符合以下條件,則稱其為 平方連續子序列 :
- 子序列的長度至少為 ,且
- 排序後 的子序列中,每個元素(除了第一個元素)都是前一個數字的 平方 。
返回 中 最長平方連續子序列 的長度,或者如果沒有 平方連續子序列 ,則返回 。
子序列(Subsequence) 是可以通過從另一個陣列中刪除一些或不刪除任何元素,且不改變剩餘元素順序而派生出的陣列。
約束條件
思路
注意,雖然題目要求的是 子序列(Subsequence) ,但由於挑選出的子序列可以任意排序,因此事實上要求的是一個 子集合(Subset) 。
方法一:暴力檢查是否在集合中
由於我們要構成一個平方連續子序列,因此我們需要檢查每個元素的平方是否在集合中。
故我們可以先將所有元素放入集合 中,接著遍歷每個元素 ,持續檢查其平方是否也在集合 中,
- 如果 的平方在集合 中,則計數器 增加,並將 更新為其平方值,繼續檢查下一個平方值。
- 如果 的平方不在集合 中,則停止檢查,並更新答案。
最後,由於題目要求平方連續子序列的長度至少為 ,因此我們需要檢查答案是否大於等於 ,如果不大於等於 ,則返回 。
複雜度分析
- 時間複雜度:,其中 是陣列長度, 是陣列中最大的數字。
- 對於每個元素 ,我們最多需要檢查 次平方,因為數字會以平方的速度增長。
- 空間複雜度:,其中 是陣列長度。
- 需要一個集合 來儲存所有元素。
1 | class Solution: |
1 | class Solution { |
方法二:排序(Sorting) + 雜湊表(Hash Table) + 動態規劃(Dynamic Programming)
注意到在方法一中,我們可能會對一個數重複檢查多次,例如當 時,我們會重複檢查 等,但若這些數字皆在陣列中,我們就會重複檢查多次。
因此我們可以用 動態規劃(Dynamic Programming) 的思想,令 表示以 為開頭的最長平方連續子序列的長度,並將每個數字對應的最長平方連續子序列的長度記錄下來,這樣我們就可以避免重複檢查。
不過由於我們在檢查小數字時,會用到該數的平方,因此我們需要先對陣列由大到小進行排序。
在轉移時,我們需要檢查 的平方 是否也在陣列中,如果不在,則 ;否則 。
同樣地,我們需要檢查答案是否大於等於 ,如果不大於等於 ,則返回 。
複雜度分析
- 時間複雜度:,其中 是陣列長度。
- 需要對陣列進行排序。
- 空間複雜度:,其中 是陣列長度。
- 需要一個雜湊表 來儲存每個數字對應的最長平方連續子序列的長度。
1 | class Solution: |
1 | class Solution { |
方法三:記憶化搜尋(Memoization)
注意到在方法二中,我們需要先對陣列進行排序,這樣會使得時間複雜度增加到 。這是因為 Bottom-up 的動態規劃需要從小到大遍歷每個數字,如果我們改為 Top-down 的動態規劃,則可以避免排序。
因此我們可以用 記憶化搜尋(Memoization) 的思想,同樣令 表示以 為開頭的最長平方連續子序列的長度,則我們在轉移時,只需要檢查 的平方 是否也在集合 中,如果不在,則 ;否則 。由於是遞迴執行,因此此時 會先於 被計算,我們不用使用排序。
但這種方法會有額外的遞迴呼叫開銷,因此雖然時間複雜度是最優的 ,但在本題的約束條件下,實際上會比其他方法慢。
複雜度分析
- 時間複雜度:,其中 是陣列長度。
- 每個數字最多只會被計算一次,因為我們使用了記憶化技術來避免重複計算。
- 空間複雜度:,其中 是陣列長度。
- 使用了一個集合來存儲所有的數字,空間複雜度為 。
- 對於每個數字只會保存一個記憶化值,因此空間複雜度為 。
1 | class Solution: |
1 | class Solution { |
寫在最後
PROMPT
Mystical Moonlight Encounter: A young anime girl, dressed in a black cape and witch hat, holds a pumpkin with an intense gaze. Standing before a large window framing a moonlit night sky, her focus is riveted on the pumpkin. To her left, a vibrant yellow pumpkin sits atop a straw bale amidst autumn leaves, adding a burst of warmth to the enchanting scene.