↓快轉到主要內容
  1. LeetCode/

LeetCode 47: Permutations II

·1 分鐘· ·
LeetCode Medium Array Backtracking Sorting
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-22

  • 提交紀錄:Wrong Answer → Accepted

解題思路
#

有重複數字的排列要去重(Backtracking 變化四)。排序後,nums[i] == nums[i - 1] 而且 nums[i - 1] 這一輪還沒被用,代表同一層已經試過這個值,跳過。這樣相同的數只會按照原本的順序出現,每種排列只產生一次。

我的嘗試
#

第一版去重的條件是對的,但忘了先排序,相同的數不相鄰,跳過的判斷沒有作用:[0, 1, 0] 回傳了重複的排列。加上 nums.sort() 就 AC 了。

正確解法
#

class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        res, path = [], []
        used = [False] * len(nums)
        def dfs():
            if len(path) == len(nums):
                res.append(path[:])
                return
            for i in range(len(nums)):
                if used[i] or (i > 0 and nums[i] == nums[i - 1] and not used[i - 1]):
                    continue
                used[i] = True
                path.append(nums[i])
                dfs()
                path.pop()
                used[i] = False
        dfs()
        return res

複雜度
#

時間 O(n · n!),空間 O(n)(不算輸出)。

要特別避免的錯誤
#

  • 去重前要先排序,相同的值才會相鄰。

面試口說整理
#

有重複的數字,我先排序,回溯時如果目前的數跟前一個一樣、而且前一個這一輪還沒用,就代表同一層已經試過這個值,跳過。時間 O(n · n!)。

相關文章

LeetCode 49: Group Anagrams
·1 分鐘
LeetCode Medium Array Hash-Table String Sorting
LeetCode 49 解題筆記:把每個字串排序後當成 key,同一個 key 的字串就是同一組 anagram
LeetCode 56: Merge Intervals
·1 分鐘
LeetCode Medium Array Sorting Quicksort
LeetCode 56 解題筆記:按起點排序,新區間的起點 <= 結果最後一個的終點就合併(終點取 max),否則另開一個
LeetCode 39: Combination Sum
·1 分鐘
LeetCode Medium Array Backtracking
LeetCode 39 解題筆記:同一個數可以重複選,所以遞迴時下一層從 i 開始(不是 i + 1),這樣也避免了順序不同的重複
LeetCode 40: Combination Sum II
·1 分鐘
LeetCode Medium Array Backtracking
LeetCode 40 解題筆記:每個數只能用一次而且有重複,排序後下一層從 i + 1 開始,同一層跳過跟前一個相同的值
LeetCode 46: Permutations
·1 分鐘
LeetCode Medium Array Backtracking
LeetCode 46 解題筆記:每一層從還沒用過的數裡選一個,用 used 陣列標記,path 滿了就記錄
LeetCode 15: 3Sum
·2 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 15 解題筆記:排序後固定第一個數,剩下用對撞指針找兩數和;三個位置都要跳過相同的值,才不會有重複的組合