如何解决arraylist 如何操作和在子集算法中重用
我不明白 ArrayList 在这个问题中是如何运作的。
这是 leetcode 中名为“子集”的问题的算法。
它基本上输出给定数组的所有子集。
例如,如果给定数组[1,2,3],那么输出应该是[[],[1],[2],[3],[1,2],3],[2,3]]
这是这个问题的算法,但我不明白 arraylist 在这段代码中是如何工作的。
import java.util.*;
class Subsets {
public static List<List<Integer>> findSubsets(int[] nums) {
List<List<Integer>> subsets = new ArrayList<>();
// start by adding the empty subset
subsets.add(new ArrayList<>());
for (int currentNumber : nums) {
// we will take all existing subsets and insert the current number in them to create new subsets
int n = subsets.size();
for (int i = 0; i < n; i++) {
// create a new subset from the existing subset and insert the current element to it
List<Integer> set = new ArrayList<>(subsets.get(i));
set.add(currentNumber);
subsets.add(set);
}
}
return subsets;
}
public static void main(String[] args) {
List<List<Integer>> result = Subsets.findSubsets(new int[] { 1,3 });
System.out.println("Here is the list of subsets: " + result);
result = Subsets.findSubsets(new int[] { 1,3 });
System.out.println("Here is the list of subsets: " + result);
}
}
我被卡住的确切代码部分
int n = subsets.size();
for (int i = 0; i < n; i++) {
List<Integer> set = new ArrayList<>(subsets.get(i));
set.add(currentNumber);
subsets.add(set);
}
}
假设 n 是 2,currentNumber 也是 2。在那篇文献中,我认为它只是创建 [2],[2] 而不是 [2],2],因为每次内部循环迭代,它都会创建一个新的 ArrayList 并具有与 currentNumber 相同的值。我不明白 [1,2] 来自哪里。
谁能解释一下它如何在第二个外部文字中输出 [2],2] 或我不明白的地方?
解决方法
要了解 [1]
的来源,我们从第一次迭代开始:
subsets.add(new ArrayList<>());
将空列表添加到集合中;
所以,如果 currentNumber
是 1
(并且集合的大小也是 1),它会将 1
添加到集合({{1} }),产生 get(0)
,然后将其添加到集合中。
现在我们发布了有问题的条件:集合为 [1]
,大小为 2 ([[],[1]]
),下一个数字将是 n = 2
(2
)。>
currentNumber = 2
有两个元素 (subsets
):空列表和仅包含 n == 2
的列表(来自前一次迭代)。
1
现在
迭代subsets = [[],[1]]
,将i = 0
添加到空列表(2
)的副本并将结果(get(0)
添加到[2])
;>
迭代 subsets
,将 i = 1
添加到 2
([1]
) 的副本,结果 get(1)
添加到 [1,2]
。
subsets
现在是 subsets
- 下一次迭代会将 [],[1],[2],[1,2]
添加到这四个列表中每一个的副本,并将生成的 4 个列表添加到 3
。>
该算法的关键是 subsets
,它正在创建一个新列表,其中包含该集合中已有的列表元素 - 一个克隆。否则最终结果将包含重复的相同列表(具有相同的内容)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。