题目
给定一个可包含重复数字的整数集合
nums
,按任意顺序 返回它所有不重复的全排列。
示例
输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]
思路
假设nums为 2 2 2 3
其实只需要把 2 2 2编号就行,因为这三个是一模一样的,那么我就规定,必须先输出第一个2,在输出第二个2,在输出第三个2。
那么dfs的时候,假设nums[i] === nums[i - 1] ,并且judge[i - 1]为false表示前面一个2没有输出过,那就不行。
if(judge[i] || (i !== 0 && nums[i] === nums[i - 1] && !judge[i - 1]))
{
continue;
}
答案
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permuteUnique = function(nums) {
const res = [];
const judge = new Array(nums.length).fill(false);
nums.sort((a, b) => a - b);
function backTrack(temp) {
if(temp.length === nums.length) {
res.push([...temp]);
return;
}
for(let i = 0; i < nums.length; i++) {
if(judge[i] || (i !== 0 && nums[i] === nums[i - 1] && !judge[i - 1])) {
continue;
}
temp.push(nums[i]);
judge[i] = true;
backTrack(temp);
temp.pop();
judge[i] = false;
}
}
backTrack([]);
return res;
};