正在处理这个leetcode问题:https://leetcode.com/problems/subsets/
,并提出了这个解决方案:
INPUT = [1, 2, 3]
var subsets = function(nums) {
let ans = []
for (let num of nums) {
// DUPLICATE ARRAY
ans = [...ans, ...ans]
const size = ans.length
// ITERATE THROUGH LAST HALF OF ARR
for (let i = size / 2; i < size; i++) {
ans[i].push(num) <------------- THIS AINT RIGHT :(
}
ans.push([num])
}
return [[], ...ans]
};
ANS = [[],[1,2,3,3],[1,2,3,3],[2,3],[1,2,3,3],[1,2,3,3],[2,3],[3]] (INCORRECT)
然而,由于某种原因,它似乎不正确地在多个索引中压入值。在摆弄了代码之后,我认为我的逻辑是正确的,我想出了这个:
var subsets = function(nums) {
let ans = []
for (let num of nums) {
// DUPLICATE ARRAY
ans = [...ans, ...ans]
const size = ans.length
for (let i = size / 2; i < size; i++) {
ans[i] = [...ans[i], num] <--------------- THIS WORKS
}
ans.push([num])
}
return [[], ...ans]
};
ANS = [[],[1],[1,2],[2],[1,3],[1,2,3],[2,3],[3]] (correct)
结果起作用了…为什么会发生这种情况?一样不arr[i].push(num)
几乎等于arr[i] = [...arr[i], num]
原因是当您这样做时,子数组不会被复制:
ans = [...ans, ...ans]
这仅仅产生相同的子数组引用。这意味着当您对ans
的第二部分中的一个子数组执行push
时,您也将通过ans
的第一部分看到效果,因为这两部分都引用了相同的子数组。
所以要解决这个问题,在生成后半部分时进行更深的复制:
ans = [...ans, ...ans.map(arr => Array.from(arr))]
第二个工作版本,执行这个深拷贝的线明显。