我试图解决leetcode 46。JS中的置换,但下面的代码得到了错误的结果,但当使用res.push([...track])
而不是res.push(track)
时将是正确的。我对此感到困惑,在我看来这两者是一样的。非常感谢。
var permute = function(nums) {
const res = []
backtrack(res, [], nums)
return res
};
var backtrack = function(res, track, nums) {
if (track.length == nums.length) {
console.log('track: ', track)
console.log('res: ', res)
console.log()
res.push(track)
//res.push([...track])
return
}
for (let i = 0; i < nums.length; i++) {
if (track.includes(nums[i])) continue
track.push(nums[i])
backtrack(res, track, nums)
track.pop()
}
}
const res = permute([1,2,3])
console.log(res)
由于res.push(track)
,这将跟踪数组的引用保留在res数组中。当你改变轨迹后,res数组也会改变。所以,您需要通过执行[...track]
来使用track中的项创建一个新数组。例如,
let res = [];
let track = [1,2,3];
res.push(track);
track.push(4);
console.log(track); // [1,2,3,4]
console.log(res); //[1,2,3,4]
res = [];
track = [1,2,3];
res.push([...track]);
track.push(4);
console.log(track); // [1,2,3,4]
console.log(res); //[1,2,3]