如何有效地检查整数数组中的所有元素是否是java中另一个数组的所有元素的子集?例如[33 11 23]是[11 23 33 42]的子集。提前谢谢。
答案 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;
}