【进阶篇 - Day 51】 2020-12-21 - 47. 全排列 II(05.剪枝 )
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]提示:
1 ⇐ nums.length ⇐ 8
-10 ⇐ nums[i] ⇐ 10来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的回答
https://github.com/leetcode-pp/91alg-2/issues/81#issuecomment-748786213
解法一
时空复杂度
时间复杂度:O(n^2)
空间复杂度: O(n)
难点在如何去重,用一个 vis 记录已经访问的数组,取到想要的数组后,将 vis 置空
var permuteUnique = function (nums) {
const res = []
let vis = Array(nums.length).fill(false)
nums = nums.sort((a, b) => a - b)
function dfs(index, temp = []) {
if (index === nums.length) {
res.push([...temp])
return
}
for (let i = 0; i < nums.length; i++) {
// 两个相邻值,且不是同时访问了
if (nums[i - 1] === nums[i] && !vis[i - 1]) continue
// 访问过,跳出
if (vis[i]) continue
temp.push(nums[i])
vis[i] = true
dfs(index + 1, temp)
vis[i] = false
temp.pop()
}
}
dfs(0)
return res
};