题目一:给定两个无序数组数组A,B;求B是否为A的子集
解法一:使用两个for循环,外部循环为A的数组的长度,内部循环使用B数组长度。时间复杂度O(M*N)
package demo;
//判断array2 是否为array1的子集
public class TwoArray {
public static void main(String args[]) {
int[] array1 = new int[] {};
int[] array2 = new int[] {};
System.out.println(isSubset(array1, array2));
}
public static boolean isSubset(int array1[], int array2[]) {
// 如果边界条件不满足直接返回(默认设定array2=null不是子集)
if (array1 == null || array2 == null || 0 == array2.length || array1.length < array2.length) {
return false;
}
// 外层array2中的每一个元素去出来比较
for (int i = 0; i < array2.length; i++) {
// 内层取array1中的每一个元素与array1[i]进行比较
for (int j = 0; j < array1.length; j++) {
// 如果判断出array2[j]==array1[i];break;外层循环
// 如果内层循环跑到底了(j==array1.length),说明出现了array1中不存在的数;直接返回false
if (array1[j] == array2[i]) {
break;
}
if (j == array1.length - 1) {
return false;
}
}
}
// 如果能执行到这来 就说明array2是array1的子集
return true;
}
}
解法二,外排方法;先进两个数组排序,在对比 时间复杂度O(mlogm)+Olog(nlogn)
boolean isSubset(int arr1[], int arr2[], int m, int n)
{
int i = 0, j = 0;
if(m < n)
return false;
Arrays.sort(arr1); //sorts arr1
Arrays.sort(arr2); // sorts arr2
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;