java笔试算法 - 两个有序数组的公共部分

题目:两个有序数组的公共部分

坑:大于时间复杂度O(N)算0分

1.无脑遍历

public void FindCom(int[] a,int[] b){
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < b.length; j++) {
                if (a[i] == b[j]){
                    System.out.print(a[i]+" ");
                }
            }
        }
    }

时间复杂度O(N*M)

2.二分查找

public boolean binarySearch(int a,int[] b){
        int left = 0;
        int right = b.length-1;
        while (left <= right){
            int mid = (left+right)/2;
            if (b[mid] > a){
                right = mid-1;
            }else if (b[mid] < a){
                left = mid+1;
            }else {
                return true;
            }
        }
        return false;
    }

    public void FindCom(int[] a,int[] b){
        for (int i = 0; i < a.length; i++) {
            if (binarySearch(a[i],b)){
                System.out.print(a[i]+" ");
            }
        }
    }

时间复杂度为O(M*logN)

3.HashHSet

public void FindCom(int[] a,int[] b){
        HashSet<Integer> hashSet = new HashSet<>();
        for (int i = 0; i < a.length; i++) {
            hashSet.add(a[i]);
        }
        for (int i = 0; i < b.length; i++) {
            if (hashSet.contains(b[i])){
                System.out.print(b[i]+" ");
            }
        }
    }

时间复杂度为O(M+N),空间复杂度为O(M).

4.双指针法

public void FindCom(int[] a,int[] b){
        for (int i = 0,j = 0; i < a.length && j < b.length ; ) {
            if (a[i] < b[j]){
                i++;
            }else if (a[i] > b[j]){
                j++;
            }else {
                System.out.print(a[i] + " ");
                i++;
                j++;
            }
        }
    }

时间复杂度为O(M+N)

测试代码

public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6,7,8,9};
        int[] b = {1,3,5,7,9};
        solution solution = new solution();
        solution.FindCom(a,b);
    }

总结:

多做,短时间内好方法是想不到的,有了一定的积累量才能快速反应。遇到双数组试者考虑双指针法。

posted @ 2022-05-14 20:07  长勺  阅读(38)  评论(0)    收藏  举报