leetcode--Median of Two Sorted Arrays

来源:互联网 发布:微信群控软件 违法吗 编辑:程序博客网 时间:2024/05/16 18:59

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

解题思路:对于a,b数组(保证a长度小于b长度),要取第k个数

我们先假设从a,b各取k/2个

如果a长度大于k/2(则b也一定大于),那么比较a[k/2-1]和b[k/2-1]

假设前者大于后者,那么a的前k/2个元素,必定包含在最小的k个元素里面(只两个数组一起算,最小的k个)。剩下k/2可能在a的k/2个元素以后取,也可能在b的前k/2个元素里面取,但是都没有关系,反正a的前k/2是一定包含在最小的k个元素里面的。那么我可以去掉a的前k/2个元素,接着求a(去掉前k/2以后),b数组的第k-k/2小的元素(递归)

如果后者大于前者,和上面一样道理,可以去掉b的前k/2个元素,接着求b(去掉前k/2以后),a数组的第k-k/2小的元素(递归)

如果两者相等,那么a[k/2-1]和b[k/2-1]就是我们要找的第k个元素,直接返回

上面的描述考虑了a长度大于k/2的情况,如果a长度小于k/2呢

那么我们就去掉a的剩余长度,然后在b里面,求第k-a.length个元素的就可以了。因为和上面说的一样,a剩余的元素,必然包含在最小的前k个元素里面,我们去掉这些元素以后,就可以b里面直接求k-a.length个元素,就是所求。


public class Solution {    /**         * @param a     * @param b     * @param start_a a数组起始位置     * @param start_b b数组起始位置     * @param k 要找第k个数     * @return     */    double findKth(int[] a,int[] b,int start_a,int start_b,int k){        if(a.length-start_a>b.length-start_b){//保证前一个数组长度,小于后一个数组            return findKth(b, a, start_b, start_a, k);        }        if(a.length-start_a==0){//如果a数组已经数尽,直接返回b数组中的第k个值,对应index为k-1            return b[k-1];        }        if(k==1){//如果要找第一个数,那么返回两者较小的                        return Math.min(a[start_a], b[start_b]);                }                int pa = Math.min(k/2, a.length-start_a);//比较a数组剩余的长度和k/2,取较小的        int pb = k - pa;//剩余的让b来处理          /*         * 如果从当前start_a开始的第k/2个数(也可能是a的最后一个数,因为a的剩余长度不够k/2)         * 小于从当前start_b开始的第k/2个数(也可能是start_b开始的第a剩余长度个数)         * 则,去掉a这一部分(可能是k/2,也可能是a的剩余部分)         */        if (a[start_a+pa-1] < b[start_b+pb-1])              return findKth(a, b, start_a+pa, start_b, k - pa);          else if (a[start_a+pa-1] > b[start_b+pb-1])//否则去掉b一部分(可能是k/2,也可能是a的剩余部分)              return findKth(a, b, start_a, start_b+pb, k - pb);           else//否则a,b都可以第k/2相等,则这个数为所求,返回即可              return a[start_a+pa-1];      }        public double findMedianSortedArrays(int[] nums1, int[] nums2) {        int total = nums1.length + nums2.length;          if((total&1)==1)              return findKth(nums1, nums2, 0, 0, total/2+1);          else              System.out.println("a");            return (findKth(nums1, nums2, 0, 0, total/2)                      + findKth(nums1, nums2, 0, 0, total/2+1))/2;      }}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 oppa79手机开不开机怎么办 黑衣服洗完发白怎么办 白衣服被黑衣服染色了怎么办 评职称单位领导不推荐怎么办 支付宝被限制收款怎么办 在淘宝上下单想写两个地址怎么办 注销了的支付宝怎么办 狗狗黑色毛发红怎么办 蘑菇街直播间被禁言了怎么办 收了发票不付款怎么办 退款要先收发票怎么办 淘宝退款了又收到货怎么办 商家收货后拒绝退款怎么办 申请退货退款卖家不处理怎么办 淘宝买东西换货卖家不发货怎么办 淘宝自动默认付款没发货怎么办 支付宝支付失败可钱扣了怎么办 苹果nfc感应坏了怎么办 老鼠添过的盘子怎么办 ie浏览器页面显示网页错误怎么办 Ⅵvo手机声音小怎么办 小米手机预约错了怎么办 小米note二手没解锁怎么办 艾灸后脸色越黑怎么办 淘宝软件类目不能上架宝贝怎么办 ae中没有mpg格式怎么办 淘宝小二处理不公怎么办 遇到卖保险的人怎么办 租房合同没理家电清单怎么办 普雪油烟机坏了怎么办 我累了 真的累了怎么办 u盘15g变成4g了怎么办 属兔的买了东户怎么办 玩时时彩输了2万怎么办 胸变的又软又小怎么办 u盘16g变成4g了怎么办 1岁宝宝吃了就吐怎么办 脚崴了肿了很痛怎么办 九格拼图5在9那怎么办 4s锁屏密码忘了怎么办 6p触屏偶尔乱跳怎么办