LeetCode 🟡 2741. Special Permutations
🔗 🟡 2741. Special Permutations 2021
tags: Weekly Contest 350
狀態壓縮(Bitmask)
動態規劃(DP)
位運算(Bit Manipulation)
狀壓DP
題意
給定一個包含 個 不同 正整數的整數陣列 ,下標從 開始。如果 的一個排列 滿足以下條件,則稱其為特殊排列:
- 對於 的下標 ,滿足 。
返回特殊排列的總數量,由於答案可能很大,請將其對 取模後返回。
約束條件
思路:狀壓 DP :排列型-相鄰相關
令 表示當前已選擇的集合為 ,且最後一個選擇的數字是 時,滿足條件的特殊排列的數量。則我們可以得到狀態轉移方程:
- ,其中 是下一個選擇的數字的下標。
- 需滿足 且 。
- 遞迴終點為 ,即所有數字都已經被選擇,其中 為 宇集合(Universal Set) 。
而注意到 ,因此我們可以使用一個 位的二進制數字來表示 ,其中第 位為 表示 已經被選擇,為 表示未被選擇, 狀態壓縮 成一個整數,並將集合的運算轉換為位運算(Bit Manipulation)。
- 由於添加到集合的操作會使該位從 變為 ,因此可以使用 來表示添加 到 中。
- 宇集合 可以表示為 。
由於會存在一些重複的子問題,因此我們可以使用 動態規劃(DP) 來避免重複計算,這裡使用了 Top-Down 的方式進行遞迴計算,並使用 記憶化搜尋(Memoization) 來保存已經計算過的結果。
初始化時可以考慮第一個選擇的數字,即 ,其中 是 的下標,將其所有的結果相加即為答案。
複雜度分析
- 時間複雜度:,其中 是 的長度。總共有 種狀態,每種狀態需要 的時間進行轉移計算。
- 空間複雜度:,即狀態數量。
1 | class Solution: |
1 | class Solution { |
類題
狀壓DP:排列型-相鄰無關
- 🟡 526. Beautiful Arrangement
- 🔴 1879. Minimum XOR Sum of Two Arrays 2415
- 🟡 2850. Minimum Moves to Spread Stones Over Grid 2001
- 🟡 1947. Maximum Compatibility Score Sum 1704
- 🔴 1799. Maximize Score After N Operations 2073
- 🔴 2172. Maximum AND Sum of Array 2392
狀壓DP:排列型-相鄰相關
- 🔴 996. Number of Squareful Arrays 1932
- 🟡 2741. Special Permutations 2021
- 🔴 1681. Minimum Incompatibility 2390
- 🔴 3149. Find the Minimum Cost Array Permutation 2642
題單來自 @灵茶山艾府
寫在最後
Cover photo is generated by @たろたろ, thanks for their work!
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus