【leetcode100】全排列Ⅱ
1、题目描述
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]
2、初始思路
2.1 思路
避免重复子集,可以使用used保存同层已经访问过的数值,以避免出现重复子集。
2.2 代码
给出used数组的两种使用方案:
(1)将同层访问过的数值加入到used中:
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
path = []
res = []
def backtracking(nums, surplus):
if len(path) == len(nums):
res.append(path.copy())
return
used = set()
for i in range(len(surplus)):
if surplus[i] in used:
continue
used.add(surplus[i])
path.append(surplus[i])
print(path)
backtracking(nums, surplus[:i]+surplus[i+1:])
path.pop()
backtracking(nums, nums)
return res
(2)创建一个与数组长度相同的used数组,如果同层访问过,则将其值保存为True:
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
path = []
res = []
nums.sort()
used = [False] * len(nums)
def backtracing(nums):
if len(path) == len(nums):
res.append(path.copy())
return
for i in range(len(nums)):
if used[i]:
continue
if i>0 and nums[i] == nums[i-1] and not used[i-1]:
continue
path.append(nums[i])
print(path)
used[i] = True
backtracing(nums)
path.pop()
used[i] = False
backtracing(nums)
return res