【问题标题】:Subset Leetcode, size of a List子集 Leetcode,列表的大小
【发布时间】:2021-11-15 19:03:51
【问题描述】:

在编译时我真的对一件事感到好奇,在下面给定的代码中,我正在创建嵌套的 for 循环,我给出了一个限制

subsetArr.size()

但是编译时说内存超出,如果我在 for 循环之前定义大小

int size = subsetArr.size()

然后将限制作为大小传递

它工作正常。可能是什么原因?

class Solution {
   public List<List<Integer>> subsets(int[] nums) {
    
    List<List<Integer>> subsetArr = new ArrayList<>();
    subsetArr.add(new ArrayList());
    
    for(int num: nums){ 
        for(int i=0; i<subsetArr.size(); i++){
            List<Integer> takenList = new ArrayList<>(subsetArr.get(i));
            takenList.add(num);
            subsetArr.add(takenList);
        }
    }
    
    return subsetArr;
}
}

【问题讨论】:

    标签: subset


    【解决方案1】:

    看看这个循环做了什么:

    for(int i=0; i<subsetArr.size(); i++){
        List<Integer> takenList = new ArrayList<>(subsetArr.get(i));
        takenList.add(num);
        subsetArr.add(takenList); // <-- here
    }
    

    每次迭代添加到集合中。所以在下一次迭代中,subsetArr.size()更大。因此,您有一个循环,它会无限期地增加集合的大小,直到资源耗尽。

    与存储值时的对比:

    int size = subsetArr.size();
    

    在这种情况下,虽然subsetArr.size() 可能会更改,但size 不会更改,除非您对其进行更新。所以只要你不更新size,那么你就有一个有限循环。

    【讨论】:

    • 谢谢,我明白了。但是为什么它没有为 ArrayList 提供 ConcurrentModificationException 呢?
    猜你喜欢
    • 2020-02-22
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多