4. 寻找两个正序数组的中位数(二分查找)

该博客讨论了如何解决寻找两个正序数组中位数的问题。作者首先分享了一个暴力解法,但指出其时间复杂度过高。接着,提出了使用二分搜索的优化方案,这种方法能在每次搜索时排除部分数据,更有效地找到中位数。通过这个方法,可以降低算法的时间复杂度,提高效率。
摘要由CSDN通过智能技术生成

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

 

一时间没有想到比较好的优化方法,所以只能采用暴力法

class Solution {

    public double findMedianSortedArrays(int[] nums1, int[] nums2) {

        double m = 0.0;

        List<Integer> num1 = new ArrayList<>();

        List<Integer> num2 = new ArrayList<>();

        for (int i = 0; i < nums1.length; i++) {

            num1.add(nums1[i]);

        }

        for (int i = 0; i < nums2.length; i++) {

            num2.add(nums2[i]);

        }

        if ((!num1.isEmpty()) && (!num2.isEmpty())){

            for (int i = 0; i < num2.size(); i++) {

                int j=0;

                while (num2.get(i) >= num1.get(j)){

                    j++;

                    if (j == num1.size()){

                        break;

                    }

                }

                num1.add(0);

                if (j != num1.size()){

                    for (int k = num1.size()-1; k > j; k--) {

                        num1.set(k, num1.get(k-1));

                    }

                }

                num1.set(j, num2.get(i));

            }

        }else {

            if (num1.isEmpty()){

                num1.addAll(num2);

            }

        }

        if (num1.size() % 2 == 0){

            m = ((double)num1.get(num1.size()/2-1)+num1.get(num1.size()/2))/2;

        }else {

            m = num1.get(num1.size()/2);

        }

        return m;

    }

}

问题:

1.虽然结果通过了,但是时间复杂度过高

2.而且方法的输入一开始没看到是数组类型的,结果自己选择了链表的数据结构

标准答案:

二分搜索

每次二分搜索时都可以删除掉一部分数据,最终剩下来的就是第k小的数,即中位数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值