avatar

LeetCode-46 全排列(JS的一次踩坑记录)

📝题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]

输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]


📝思路

老经典回溯了,复盘一下,这次用 JS 写的,res 一直不对劲,看了题解才发现坑在于数组(对象)都是传的引用,push 的时候当然也是一直传进去了(同)一个地址,后续改变 trackList 的时候 res 里面就变成了一堆同样的数组:(

📝题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function track(nums, res, trackList) {
if (trackList.length == nums.length) {
/* 这样写传的是数组引用,会被后续操作修改 */
// res.push(trackList);
res.push(trackList.concat());
return;
}
for (let i = 0; i < nums.length; i++) {
if (trackList.indexOf(nums[i]) == -1) {
trackList.push(nums[i]);
track(nums, res, trackList);
trackList.pop();
}
}
}

var permute = function(nums) {
let res = new Array(), trackList = new Array();
track(nums, res, trackList);
return res;
};
Author:WhiteBeerHouse
Link:https://github.com/WhiteBeerHouse/WhiteBeerHouse.github.io/tree/master/2021/03/24/LeetCode-46%20%E5%85%A8%E6%8E%92%E5%88%97%EF%BC%88JS%E7%9A%84%E4%B8%80%E6%AC%A1%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95%EF%BC%89/
Copyright Notice:All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.