子集 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 子数组引用。这意味着当您 pushans第二 半部分中的一个子数组时,您还将通过 @987654324 的 半部分看到效果@,因为两半都引用了 same 子数组。

所以为了解决这个问题,在制作后半部分时做一个更深的副本:

    ans = [...ans, ...ans.map(arr => Array.from(arr))]

第二个工作版本在您标记的行中执行此更深的复制。

【讨论】:

啊啊啊,说得有道理。该死的数组引用...谢谢@trincot!

以上是关于子集 leetcode - 推入 arr 似乎错误地推入错误的索引的主要内容,如果未能解决你的问题,请参考以下文章

推入 mongoose 对象内部的数组

不应修改的数组[重复]

哈希 - 推断一个数组是否为还有一个数组的子集

将 1D 向量作为行推入 2D 向量数组

LeetCode852. 山脉数组的峰顶索引 / 374. 猜数字大小 / 278. 第一个错误的版本 / 第 54 场双周赛 / 第 245 场周赛

2021-08-10:给定一个正数数组arr,返回arr的子集不能累加出的最小正数。1)正常怎么做? 2)如果arr中肯定有1这个值,怎么做?