Java:获取2个数组,查找两个数组中存在的元素是否返回true,如果存在,否则返回false

Java:获取2个数组,查找两个数组中存在的元素是否返回true,如果存在,否则返回false,java,arrays,algorithm,Java,Arrays,Algorithm,我正在寻找一些关于这个解决方案的澄清。有谁能就以下两点向我提供指导: 下面的算法是好的解决方案吗 我的大O计算正确吗 非常感谢您的澄清。提前谢谢 public static void main(String[] args) { String[] a = {"a", "b", "c", "d"}; String[] b = {"z", "f", "c"}; boolean value1 = find(a, b); System.out.println(value1

我正在寻找一些关于这个解决方案的澄清。有谁能就以下两点向我提供指导:

  • 下面的算法是好的解决方案吗
  • 我的大O计算正确吗 非常感谢您的澄清。提前谢谢

    public static void main(String[] args) {
        String[] a = {"a", "b", "c", "d"};
        String[] b = {"z", "f", "c"};
    
        boolean value1 = find(a, b);
        System.out.println(value1);
    
        boolean value2 = findArray(a, b);
        System.out.println(value2);
    
    }
    
    /*
    since the both the array is of diff size for nested loop
    Big O  = O(n*n)
    if array size is same Big O = O(n^2)
     */
    private static boolean find(String[] a, String[] b) {
        for (int i = 0; i < a.length; i++) {
            String val1 = a[i];
            for (int j = 0; j < b.length; j++) {
                if (val1.equals(b[j])) {
                    System.out.println(val1 + " : " + b[j]);
    
                    return true;
                }
            }// O(n)
        }// O(n)
        return false;
    }// O(n*n)
    
    /*
    Big O  = O(n)
     */
    private static boolean findArray(String[] a, String[] b) {
        //create array list from array
        List<String> list = new ArrayList<>(Arrays.asList(b));
        for (int i = 0; i < a.length; i++) {
            String val1 = a[i]; //O(1)
    
            if (list.contains(val1)) {
                System.out.println(val1 + " : contain in list b");
                return true;
            }// O(1)
    
        }// O(n)
        return false;
    }// O(n)
    
    publicstaticvoidmain(字符串[]args){
    字符串[]a={“a”、“b”、“c”、“d”};
    字符串[]b={“z”,“f”,“c”};
    布尔值1=查找(a,b);
    系统输出打印项次(值1);
    布尔值2=findArray(a,b);
    系统输出打印项次(值2);
    }
    /*
    由于这两个数组的大小不同,因此嵌套循环的大小不同
    大O=O(n*n)
    如果数组大小相同,则大O=O(n^2)
    */
    私有静态布尔查找(字符串[]a,字符串[]b){
    for(int i=0;i
  • 我认为这两种算法看起来都是合理的
  • ArrayList.contains的时间复杂度为O(n) size、isEmpty、get、set、iterator和listIterator操作以固定时间运行。添加操作在摊销的固定时间内运行,即添加n个元素需要O(n)个时间所有其他操作都以线性时间运行(粗略地说)。与LinkedList实现相比,常数因子较低


    您的第二个解决方案也是O(N^2),因为包含在引擎盖下工作O(N)

    第一个解决方案O(N*LogN):

  • 排序第二个数组。恩洛恩
  • 迭代第一个O(N)和第二个 一个O(logN)=>O(NLogN)
  • 总体复杂度O(NLogN)

    第二个解决方案O(N)-如果数组已排序。如果不是O(NLogN),由于步骤1

  • 对两个数组进行排序O(NlogN)
  • 做这样的事
  • 代码:

    int curA=0,路缘=0;
    while(true){
    如果(curA>=a.length | |路缘>=b.length)
    打破
    如果(a[curA]b[路缘]){
    路缘++;
    继续;
    }
    返回true;
    }
    返回false;
    
    这个问题不是更像一个问题吗?谢谢你的回答。在时间复杂度方面,有没有更好的方法来解决这个问题。很高兴能提供帮助!我想不出比@mondayguy建议的更好的解决方案了。
    int curA = 0, curB = 0;
    while (true) {
     if (curA >= a.length || curB >= b.length)
      break;
     if (a[curA] < b[curB]) {
      curA++;
      continue;
     }
    
     if (a[curA] > b[curB]) {
      curB++;
      continue;
     }
    
     return true;
    }
    return false;