微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

arraylist 如何操作和在子集算法中重用

如何解决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<>()); 将空列表添加到集合中;

所以,如果 currentNumber1(并且集合的大小也是 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 举报,一经查实,本站将立刻删除。