子集 Leetcode,列表的大小

Subset Leetcode, size of a List

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

subsetArr.size()

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

int size = subsetArr.size()

然后将限制作为大小传递

i<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;
}
}

看看这个循环做了什么:

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 那么你就会有一个有限循环。