数组是另一个数组的子集

时间:2013-03-26 03:04:05

标签: java arrays subset

如何有效地检查整数数组中的所有元素是否是java中另一个数组的所有元素的子集?例如[33 11 23]是[11 23 33 42]的子集。提前谢谢。

7 个答案:

答案 0 :(得分:7)

如果你没有使用Arrays,那么任何Java集合都有containsAll方法:

boolean isSubset = bigList.containsAll(smallList);

这将完全符合您的要求。

答案 1 :(得分:3)

假设您要检查A是B的子集。将B的每个元素放入散列中,然后迭代A中的元素,所有这些元素必须存在于散列中

答案 2 :(得分:2)

从超集数组中创建HashSet。检查子集数组的每个元素是否都包含在HashSet中。这是一个非常快速的操作。

答案 3 :(得分:1)

我有两个不同的解决方案

输入: int mainArray[] = { 1, 2, 3, 2, 5, 6, 2 }, subArray[] = { 2, 2, 2 };

  • 第一个解决方案迭代两个数组并进行比较, main[i] = -1用于避免重复包含的元素

    void findIfArrayIsASubset(int[] main, int[] sub) {
    int count = 0;
    for (int i = 0; i < main.length; i++) {
        for (int j = 0; j < sub.length; j++) {
            if (main[i] == sub[j]) {
                main[i] = -1;
                count++;
                break;
            }
        }
    }
    if (count == sub.length)
        System.out.println("is a subset");
    else
        System.out.println("is not a subset");
    }
    
  • 第二个解决方案使用具有来自1....9的密钥和值为0的散列图,
    接下来,我们遍历主数组并+1到各自的值
    接下来,我们遍历子数组并-1到各自的值
    下一个comapre hashmap值的总和与两个数组的长度差异

    void findIfArrayIsASubset(int[] main, int[] sub) {
    Map<Integer, Integer> mainMap = new HashMap<Integer, Integer>();
    for (int i = 0; i < 10; i++) {
        mainMap.put(i, 0);
    }
    for (int i = 0; i < main.length; i++) {
        mainMap.put(main[i], mainMap.get(main[i]) + 1);
    }
    for (int i = 0; i < sub.length; i++) {
        mainMap.put(main[i], mainMap.get(main[i]) - 1);
    }
    String output = mainMap.values().stream().reduce(0, Integer::sum).compareTo(main.length - sub.length) == 0
            ? "is a subset" : "not a subset";
    System.out.println(output);
    }
    

答案 4 :(得分:0)

外部循环逐个选取arr2 []的所有元素。内循环线性搜索外循环拾取的元素。如果找到所有元素,则返回true,否则返回false

boolean checkIsSubset(int arr1 [],int arr2 []){

    int m=arr1.length,  n=arr2.length;
    int i = 0;
    int j = 0;
    for (i=0; i<n; i++){
        for (j = 0; j<m; j++){
           if(arr2[i] == arr1[j])
              break;
        }
        if (j == m)
           return false;
    }
    return true;
}

为什么排序后进行二元搜索? 由于两个数组都将以排序形式提供,我们可以使用以下两个指针: -

boolean isSubset(int arr1 [],int arr2 [],int m,int n){

int i = 0, j = 0;
quickSort(arr1, 0, m-1);
quickSort(arr2, 0, n-1);
while( i < n && j < m )
{
    if( arr1[j] <arr2[i] )
        j++;
    else if( arr1[j] == arr2[i] )
    {
        j++;
        i++;
    }
    else if( arr1[j] > arr2[i] )
        return false;
}

if( i < n )
    return false;
else
    return true;

}

答案 5 :(得分:0)

对两个数组都进行排序,并检查larget数组中是否存在较小数组中的所有元素。这是在不使用额外空间的情况下。

如果不像已经建议的那样使用hasmap。

答案 6 :(得分:-1)

这将检查较大数组中是否缺少可能子集的任何元素。如果是,它不是一个子集:

boolean isSubset(int[] a1, int[] a2) {
    a2 = Arrays.copyOf(a2, a2.length);
    Arrays.sort(a2);
    for(int e : a1) {
        if (Arrays.binarySearch(a2, e) < 0) {
            return false;
        }
    }
    return true;
}