全排列

回溯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function (nums) {
// 全排列
let res = [];
function backtrack(cur, arr) {
if (cur.length === nums.length) {
res.push([...cur]);
return;
}
for (let i = 0; i < arr.length; i++) {
const item = arr[i];
const arrBack = arr.slice();
arrBack.splice(i, 1);
backtrack([...cur, item], arrBack);
}
}
backtrack([], nums);
return res;
};
// console.log(permute([1, 2, 3]));

优化1
每次arr.splicearr.slice开销太大,使用used标志来控制

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
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function (nums) {
// 全排列
let res = [];
const used = Array.from({ length: nums.length }).fill(false);
function backtrack(path) {
if (path.length === nums.length) {
res.push([...path]);
return;
}
for (let i = 0; i < nums.length; i++) {
if (used[i]) continue;
used[i] = true;
path.push(nums[i]);
backtrack(path);
path.pop();
used[i] = false;
}
}
backtrack([]);
// console.log(used);
return res;
};
// console.log(permute([1, 2, 3]));

优化2
原地交换法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function (nums) {
// 全排列
let res = [];
function backtrack(start) {
if (start === nums.length) {
res.push([...nums]);
return;
}
for (let i = start; i < nums.length; i++) {
[nums[start], nums[i]] = [nums[i], nums[start]];
backtrack(start + 1);
[nums[start], nums[i]] = [nums[i], nums[start]];
}
}
backtrack(0);
// console.log(used);
return res;
};
// console.log(permute([1, 2, 3]));

本站由 ao 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。