47.全排列 II

全排列 II

给定一个可包含重复数字的序列 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

解析

在全排列基础上加剪枝去重:排序后,同层递归中跳过重复元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permuteUnique = function (nums) {
const result = [];
const used = new Array(nums.length).fill(false);
nums.sort((a, b) => a - b);

function backtrack(path) {
if (path.length === nums.length) {
result.push([...path]);
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;
path.push(nums[i]);
backtrack(path);
path.pop();
used[i] = false;
}
}

backtrack([]);
return result;
};

去重的关键:nums[i] === nums[i-1] && !used[i-1] 确保重复数字只按照第一次出现的顺序被选取。


47.全排列 II
https://leetcode.lz5z.com/47.permutations-ii/
作者
tickli
发布于
2023年10月6日
许可协议