47.全排列 II
力扣題目鏈接
給定一個可包含重復數字的序列?nums
?,按任意順序?返回所有不重復的全排列。
示例 1:
輸入:nums = [1,1,2] 輸出: [[1,1,2],[1,2,1],[2,1,1]]
示例 2:
輸入:nums = [1,2,3] 輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
這個很難理解,要加一層判斷:
if i > 0 and nums[i] == nums[i-1] and used[i - 1] == 0這里是因為橫向遍歷是順序的,nums[i] == nums[i-1] and used[i - 1] == 0?說明前一個相同的節點i-1這個節點已經被使用過,這里就可以直接跳過i.
在全排列中used[i-1]==0 是區分樹層相同元素訪問和枝葉相同元素訪問的關鍵。如果是在遞歸中訪問到相同元素,那么used[i-1]一定等于1.
class Solution:def permuteUnique(self, nums: List[int]) -> List[List[int]]:path = []result = []used = []nums.sort()for i in range(len(nums)):used.append(0)self.backtracking(nums, path, used, result)return resultdef backtracking(self, nums: List[int], path: List[int], used: List[int], result: List[List[int]]):if len(path) == len(nums):result.append(path.copy())returnfor i in range(len(nums)):if i > 0 and nums[i] == nums[i-1] and used[i - 1] == 0: # used[i - 1] == 0 說明i-1這個節點已經被使用過continueif used[i] == 0:path.append(nums[i])used[i] = 1self.backtracking(nums, path, used, result)path.pop()used[i] = 0