题目🌵
📝Leetcode 47. 全排列 II
✏️leetcode-cn.com/problems/pe…
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
解题思路💡
-
递归+回溯
-
回溯的本质就是穷举,我们这里可以抽象成一个n叉树
-
回溯需要终止条件
-
在当前题目中,当路径中的元素个数===数组元素个数,即为一组排列组合
if (path.length === nums.length) { res.push([...path]) //当数组元素===原来数组的个数,说明一种排列组合完成 //递归终止 return } -
定义used数组,为了保证当前的排列中用的元素唯一
-
-
需要考虑重复的元素,首先需要一个有序数组,然后在递归层进行剪枝操作
var permuteUnique = function (nums) {
nums.sort((a, b) => a - b)
const res = [],
path = []
backTracking([])
return res
function backTracking(used) {
if (path.length === nums.length) {
res.push([...path])
return
}
for (let i = 0; i < nums.length; i++) {
//去重,在树层上剪去重复的分支
if (i > 0 && nums[i] === nums[i - 1] && !used[i - 1]) {
continue
}
if (!used[i]) {
path.push(nums[i])
used[i] = true
backTracking(used)
path.pop()
used[i] = false
}
}
}
}