47. 全排列 II
原始题目链接:https://leetcode.cn/problems/permutations-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
解题思路:
和49题比都是用回溯方法,有重复的元素,所以要进行去重操作,需要注意的是,去重一定要对元素经行排序,这样通过相邻的节点来判断是否重复使用了。
代码实现:
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
res = []
path = []
used = [0] * len(nums)
def backtracking(nums, used):
if len(path) == len(nums):
res.append(path.copy())
return
for i in range(len(nums)):
if not used[i]:
# 去重
if i > 0 and nums[i] == nums[i - 1] and not used[i - 1]:
continue
# 使用标志
used[i] = 1
path.append(nums[i])
# 递归调用
backtracking(nums, used)
# 回溯
path.pop()
used[i] = 0
# 去重一定要对元素经行排序,这样通过相邻的节点来判断是否重复使用了
backtracking(sorted(nums), used)
return res
参考文献:
https://leetcode.cn/problems/permutations-ii/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-hui-s-ki1h/