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 @   长勺  阅读(32)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示