子集 leetcode - 推入 arr 似乎错误地推入错误的索引
Posted
技术标签:
【中文标题】子集 leetcode - 推入 arr 似乎错误地推入错误的索引【英文标题】:Subsets leetcode - Pushing into arr seems to be incorrectly pushing into wrong indexes 【发布时间】:2021-10-07 19:15:08 【问题描述】:正在处理这个 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]
不完全一样
【问题讨论】:
我暂时删除了我的答案,因为我们需要知道您的输入(请将其包含在问题本身中)。我专注于为什么push
不相等的问题,而不是回答实际的挑战:)
它不起作用。这就是为什么我如此困惑。 ans = [[0], [1], [2]]
。所以复制它是ans = [[0], [1], [2], [0], [1], [2]]
。所以在下半场迭代时,push 应该是正确的……但它不是……
输入为[1, 2, 3]
输入是nums = [0, 1, 2]
。所需的输出是[[],[1],[1,2],[2],[1,3],[1,2,3],[2,3],[3]]
。您可以在每个循环之后看到,我将[num]
推入ans
arr
是的,我现在明白你在做什么了,@sssyn。
【参考方案1】:
原因是你这样做的时候没有复制子数组:
ans = [...ans, ...ans]
这只会产生 same 子数组引用。这意味着当您 push
到 ans
的 第二 半部分中的一个子数组时,您还将通过 @987654324 的 前 半部分看到效果@,因为两半都引用了 same 子数组。
所以为了解决这个问题,在制作后半部分时做一个更深的副本:
ans = [...ans, ...ans.map(arr => Array.from(arr))]
第二个工作版本在您标记的行中执行此更深的复制。
【讨论】:
啊啊啊,说得有道理。该死的数组引用...谢谢@trincot!以上是关于子集 leetcode - 推入 arr 似乎错误地推入错误的索引的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode852. 山脉数组的峰顶索引 / 374. 猜数字大小 / 278. 第一个错误的版本 / 第 54 场双周赛 / 第 245 场周赛
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加出的最小正数。1)正常怎么做? 2)如果arr中肯定有1这个值,怎么做?