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;
}
为什么要在排序后进行二分查找?由于这两个数组都可以以排序的形式使用,我们可以只使用两个指针,如下所示: public boolean canCatch(int [] nums,int [] nums){
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;
8条答案
按热度按时间roejwanj1#
如果你不需要使用Arrays,任何Java集合都有
containsAll
方法:这将做你想要的,高效。
xzv2uavs2#
从超集数组中生成
HashSet
。检查子集数组的每个元素是否包含在HashSet
中。这是一个非常快速的操作。jobtbby33#
假设你想检查A是B的子集。将B的每个元素放入一个散列中,然后迭代A中的元素,所有元素都必须存在于散列中
b5lpy0ml4#
外部循环一个接一个地拾取arr2[]的所有元素。内部循环线性搜索外部循环拾取的元素。如果找到所有元素,则返回true,否则返回false。
public boolean canCatch(int [] nums,int [] nums){
为什么要在排序后进行二分查找?由于这两个数组都可以以排序的形式使用,我们可以只使用两个指针,如下所示:
public boolean canCatch(int [] nums,int [] nums){
}
3ks5zfa05#
我带来了两种不同的解决方案
输入:
int mainArray[] = { 1, 2, 3, 2, 5, 6, 2 }, subArray[] = { 2, 2, 2 };
main[i] = -1
用于避免再次包含重复元素1....9
的键和作为0
的值的散列图,接下来,我们迭代主数组和
+1
以获得相应的值接下来,我们迭代子数组和
-1
以获得相应的值下一个比较两个数组长度之差的哈希Map值的和
azpvetkf6#
对两个数组进行排序,并检查较小数组中的所有元素是否存在于较大数组中。这不需要使用额外的空间。
如果没有,就像有人建议的那样使用hasmap。
pkln4tw67#
只需简单地将这两个数组转换为两个字符串,并比较一个字符串是否包含另一个字符串。
qacovj5a8#
这将检查较大数组中是否缺少可能子集的任何元素。如果是,则它不是子集: