Subsets leetcode -压入arr似乎不正确地压入错误的索引



正在处理这个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))]

第二个工作版本,执行这个深拷贝的线明显。

相关内容

最新更新