【问题标题】:Array Subset problem [least space with O(n) time complexity]数组子集问题 [O(n) 时间复杂度的最小空间]
【发布时间】:2019-02-13 23:16:44
【问题描述】:

我想在 java 中编写一个函数,它将 2 个数组作为输入,如果较小的数组是较大数组的子集,则返回 true

有没有办法让下面的代码更简洁和更节省空间(同时保持 O(n) 时间复杂度?

public boolean isArraySubset(int[] arr1, int arr2[]) {
    Set<Integer> set = new HashSet<>();

    int largeArr[];
    int smallArr[];
    if (arr1.length > arr2.length) {
        largeArr = arr1;
        smallArr = arr2;
    } else {
        largeArr = arr2;
        smallArr = arr1;
    }
    for (int i : largeArr) {
        set.add(i);
    }
    for (int i : smallArr) {
        if (!set.contains(i)) {
            return false;
        }
    }

    return true;
}

【问题讨论】:

  • 我不是Java开发人员,但只是想一想,您可以将较小数组的项目添加到集合中,然后删除较大数组的每个项目。如果集合最后不为空,则较小的数组不是较大数组的子集。只有当一个数组比另一个数组小很多时,这才是一个显着的改进。
  • 绝对有意义,如果一个数组比另一个小得多。还想知道如何更简洁地编写此代码。谢谢@p.s.w.g
  • 一方面,有更多的表达方式来初始化数组中的集合,例如stackoverflow.com/questions/2041778/…。据我所知(我不是 Java 开发人员),您可以使用较新版本的 Java 使其更短。

标签: java arrays time-complexity


【解决方案1】:

为什么不使用Set&lt;T&gt;?只需使用removeAll 方法并检查较小的Set 的大小。这种事情已经为你做好了。

smallerSet.removeAll(largerSet);

if (smallerSet.isEmpty()) {
   // It's a subset
}

【讨论】:

  • 我不确定您的解决方案是否有效。让我们举个例子,即。较小集={1,2} & 较大集={1,2,400}。根据您的逻辑,retainAll 操作后,smallerSet 将是 {1,2}。 smallSet 不是空的,但仍然是 largeSet 的子集
  • @Vik 我编辑了问题以更改retainaAll > removeAll。对不起,我的错,我不知道为什么我写了retainAll(可能是一天的疲倦)
  • 感谢@LppEdd。这很有道理!
猜你喜欢
  • 2015-05-25
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2013-11-30
  • 1970-01-01
  • 2022-10-24
相关资源
最近更新 更多