Given a collection of numbers, nums, that might contain duplicates, return all possible unique permutations in any order.
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permuteUnique = function (nums) {
const solutions = [];
nums.sort((a, b) => a - b);
backtracking(nums, solutions, [], new Set());
return solutions;
};
const backtracking = (nums, solutions, current, used) => {
if (current.length === nums.length) {
return solutions.push(current.slice());
}
for (let i = 0; i < nums.length; i++) {
if (used.has(i)) {
continue;
}
previous is used
if (i > 0 && nums[i] === nums[i - 1] && !used.has(i - 1)) {
continue;
}
current.push(nums[i]);
used.add(i);
backtracking(nums, solutions, current, used);
current.pop();
used.delete(i);
}
}
if문 if (i > 0 && nums[i] === nums[i - 1] && !used.has(i - 1)) 조건은 중복을 체크해 주는 것 이다.