二分查找

啥也不说,先上题!

1.leetode-寻找两个有序数组的中位数

题目描述

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。

nums1 = [1, 3],nums2 = [2],则中位数是 2.0

解题思路

大佬写的太好了,https://leetcode.com/problems/median-of-two-sorted-arrays/discuss/2471/Very-concise-O(log(min(MN)))-iterative-solution-with-detailed-explanation

代码
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n1 = nums1.size();
        int n2 = nums2.size();
        if(n1>n2) return findMedianSortedArrays(nums2, nums1);

        int imin=0, imax=n1;
        while(imin<=imax){
            int cut1=(imin+imax)/2;
            int cut2 = (n1+n2)/2 - cut1;

            int l1 = (cut1==0)?INT_MIN:nums1[cut1-1];
            int l2 = (cut2==0)?INT_MIN:nums2[cut2-1];
            int r1 = (cut1==n1)?INT_MAX:nums1[cut1];
            int r2 = (cut2==n2)?INT_MAX:nums2[cut2];

            if(l1>r2) imax = cut1-1;
            else if(l2>r1) imin = cut1+1;
            else return (n1+n2)%2 ? min(r1, r2):(max(l1,l2)+min(r1,r2))/2.0;
        }
        return 0.0;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 二分查找又称折半查找,实际操作时,在排好序的队列中,每次取中间位置值与目标值对比,由于已经排序,无论对比结果如何都...
    s1991721阅读 3,851评论 0 2
  • 原文链接: 点这里更多内容就在我的个人博客 BlackBlog.tech 欢迎关注!谢谢大家! 本文源自LeetC...
    BlackBlog__阅读 8,550评论 2 13
  • 1. 最简单的二分查找有什么用## 对于一个有序数列,查找某一个特定值。 二分查找需要保持数组的有序性### 如果...
    tdeblog阅读 2,635评论 1 1
  • 题目汇总 以下链接均为我博客内对应博文,有解题思路和代码,不定时更新补充。 目前范围:Leetcode前150题 ...
    蛮三刀酱阅读 4,348评论 0 0
  • 元旦前的周三,预约挂号中西结合科看病。是位四十岁左右的女医生。在旁等候时,见她对病人,尤其是上了年纪的老人,想起电...
    沉睡中的石头阅读 1,800评论 0 7