数组是另一个数组的子集
如何有效地检查整数数组中的所有元素是否是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; }