这一题是结合了46题(全排列)以及40题(去重)
13行的这个continue没什么好说的,剪掉自己
这里的重点就是在16行,前面的一个元素没有被使用过,且当前的元素也没有被使用过,且两个元素相同,那么就可
var permuteUnique = function (nums) {
let res = []
nums.sort((a, b) => a - b)
// 标记当前元素是否使用过
let used = new Array(nums.length).fill(false)
var backtrack = function (one) {
if (one.length === nums.length) {
res.push([...one])
return
}
for (let i = 0; i < nums.length; ++i) {
// 当前元素使用过,则跳过
if (used[i]) continue
// 确保在同一层级的递归中,相同的元素只被使用一次
// 如果当前元素与前一个元素相同,并且前一个元素未被使用,则跳过当前元素。
if (i > 0 && nums[i] === nums[i - 1] && !used[i - 1]) continue
used[i] = true
one.push(nums[i])
backtrack(one)
used[i] = false
one.pop()
}
}
backtrack([])
return res
};
说实话,我还是有点不太理解,为什么当前元素没有被使用过,且前面的元素也没有被使用过,为什么要跳过当前元素的这个操作
附加一个示意图