给定一个可包含重复数字的序列 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-
解法一:回溯
function permuteUnique(nums: number[]): number[][] {let res : Array<Array<number>> = []nums.sort((a,b) => a-b)let n = nums.lengthlet used = Array(n).fill(false)recursion([])return resfunction recursion(cur :Array<number>) {if(cur.length === n) {res.push([...cur])return}for (let [i, num] of nums.entries()) {if (used[i]) {continue}// 这里的剪枝条件需要增加前一个已经使用的// 如果当前和前一个一样,那么存在两种情况,// 一种是前一个已经使用了,那么当前可以正常使用,// 如果前一个没使用,表示其已经进入到使用之后的逻辑了,所以当前这个不能用if (i > 0 && num === nums[i-1] && !used[i-1]) {continue}cur.push(num)used[i] = truerecursion(cur)cur.pop()used[i] = false}}}
