Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2] have the following unique permutations:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路:
这道题是之前那道 Permutations 全排列的延伸,由于输入数组有可能出现重复数字,如果按照之前的算法运算,会有重复排列产生,我们要避免重复的产生,在递归函数中要判断前面一个数和当前的数是否相等,如果相等,前面的数必须已经使用了,即对应的visited中的值为1,当前的数字才能使用,否则需要跳过,这样就不会产生重复排列了,代码如下:
var permute = function(nums) {
var res = [];
var out = [];
var visited = [];
nums.sort((a,b)=>a-b)
for (var i = 0; i < nums.length; i++) {
visited[i] = 0;
}
permuteDFS(nums, 0, out, res, visited);
return res;
function permuteDFS(nums, pos, out, res, visited) {
var tmp = out.concat();
if (pos === nums.length) res.push(tmp);
else {
for (var i = 0; i < nums.length; i++) {
if (visited[i] === 0) {
if(i>0 && nums[i]===nums[i-1] && visited[i-1]==0) continue;
visited[i] = 1;
out.push(nums[i]);
permuteDFS(nums, pos + 1, out, res, visited);
out.pop();
visited[i] = 0;
}
}
}
}
};
网友评论