仰望星空的人,不应该被嘲笑
题目描述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
本题是求全排列,并且排列不能重复。我们用一个 vis
数组维护一下,让每一条路线保证不重复选取元素,而对于每一层而言,需要判断相邻元素是否相同,相同的就没必要走了,例如下图中红色三角形部分。
果当前的选项 nums[i]
,与同一层的上一个选项 nums[i - 1]
相同,且 nums[i - 1]
有意义(即索引 >= 0
),且没有被使用过,那就跳过该选项。
因为 nums[i - 1]
如果被使用过,它会被修剪掉,不是一个选项了,即便它和 nums[i]
重复,nums[i]
还是可以选的。
var permuteUnique = function(nums) {
let res = [];
nums.sort((a,b) => a-b);
let vis = {
};
let dfs = (t) => {
if(t.length === nums.length){
res.push(t);
}
for(let i=0;i<nums.length;i++){
if(i-1>=0 && nums[i] == nums[i-1] && !vis[i-1]) continue;
if(vis[i]) continue;
vis[i] = true;
t.push(nums[i]);
dfs(t.slice(),i+1);
t.pop();
vis[i] = false;
}
}
dfs([],0);
return res;
};
最后
文章产出不易,还望各位小伙伴们支持一波!
往期精选:
访问超逸の博客,方便小伙伴阅读玩耍~
学如逆水行舟,不进则退