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

4. 寻找两个正序数组的中位数

难度困难3569

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

进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

示例 3:

输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000

示例 4:

输入:nums1 = [], nums2 = [1]
输出:1.00000

示例 5:

输入:nums1 = [2], nums2 = []
输出:2.00000

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -10<sup>6</sup> <= nums1[i], nums2[i] <= 10<sup>6</sup>

My solution(归并法)

import java.util.Arrays;
public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int[] arr=new int[nums1.length+nums2.length];
        for(int i=0;i<nums1.length;i++)
            arr[i]=nums1[i];
        for (int i =0;i<nums2.length;i++)
            arr[i+nums1.length]=nums2[i];
        Arrays.sort(arr);
        return arr.length%2==1?arr[(arr.length-1)/2]:(arr[arr.length/2]+arr[arr.length/2-1])/2.0;
    }
}

执行用时:5 ms, 在所有 Java 提交中击败了14.05%的用户
内存消耗:39.6 MB, 在所有 Java 提交中击败了81.65%的用户

关于Arrays的sort方法,这里有一篇文章详细介绍了它使用的算法https://www.cnblogs.com/baichunyu/p/11935995.html

我的解法肯定达不到题目要求的时间复杂度O(logn),一般出现这样的对数时间复杂度,都是用到了二分查找法:

二分查找

public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int n=nums1.length+nums2.length;
        if(n%2==1)//和为奇数,返回第n/2+1个数
                return getMid(nums1,nums2,n/2+1);
        if(n%2==0)//和为偶数,返回第n/2个数和第n/2+1个数的和的一半
                return (getMid(nums1,nums2,n/2)+getMid(nums1,nums2,n/2+1))/2.0;
        else
            return 0;
    }
    public double getMid(int[] nums1, int[] nums2,int k){
        //返回第k个数
        int start1=0,start2=0;
        while(true){
            if(start1==nums1.length)
                return nums2[start2+k-1];
            if(start2==nums2.length)
                return nums1[start1+k-1];
            if(k==1)
                return Math.min(nums1[start1],nums2[start2]);
           int index1=Math.min(start1+k/2-1,nums1.length-1);
           int index2=Math.min(start2+k/2-1,nums2.length-1);
             if(nums1[index1]<=nums2[index2])
            {
                k-=index1-start1+1;
                start1=index1+1;
            }
            else
            {
                k-=index2-start2+1;
                start2=index2+1;
            }
        }
    }
}

该代码是leetcode官方二分法解答的简化版,其主要就是定义了一个函数,运用二分法获取两个数组中从小到大第k个元素

其中start1,start2分别代表数组的起始指针,初始值为0,都指向第一个元素;

进入循环后,首先判断起始指针是否已经到数组的最后,如果是,表示其中一个数组已经判断完了,只需返回剩余数组的第k个元素即为结果

如果k=1,这时两个数组都还没有判断完,这时只需返回剩余数组的最小元素(第一个),即两个数组第一个元素的最小值;

主要部分:
首先获取接下来需要判断的index,这个index不能超过数组的最大值,所以需要判断一下,相应的k也就不能直接写成k-=k/2,因为判断完舍去的元素个数不一定为k/2,新的起始指针设为index+1,因为判断完后,连位置为index的元素也一并舍去了,所以需要从下一个元素开始判断

具体的原理可以直接看下面的链接

时间复杂度为O(logn)的算法要先考虑二分法,这种方法复杂的地方就在于奇偶判断这部分,建议画图,举例解决

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-s-114/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,848评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,529评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,824评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,329评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,227评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,879评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,218评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,877评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,159评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,155评论 2 315
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,987评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,736评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,273评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,407评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,663评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,158评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,517评论 2 339

推荐阅读更多精彩内容