数组是另一个数组的子集

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

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

如果您不必使用Arrays,则任何Java集合都具有containsAll方法:

 boolean isSubset = bigList.containsAll(smallList); 

这将完全符合您的要求。

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

我有两个不同的解决方案

input: 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键的hashmap,
    接下来,我们遍历主数组并+1到相应的值
    接下来,我们遍历子数组和-1到各自的值
    下一个comapre的hashmap值的总和,以两个数组的长度差异

     void findIfArrayIsASubset(int[] main, int[] sub) { Map mainMap = new HashMap(); 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); } 

外循环逐个选取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 

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

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] ) return false; } if( i < n ) return false; else return true; 

}

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

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