码迷,mamicode.com
首页 > 编程语言 > 详细

【LeetCode 4】寻找两个有序数组的中位数

时间:2019-11-01 22:51:18      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:定位   +=   序列   链接   第k小   转换   com   amp   ndk   

题目链接

【题解】


假设在两个有序的序列中找第k小的数字。
那么我们先定位第一个序列中的第k/2个数字(不足则取最边上的那个数字)记下标为i1
然后定位第二个序列中的第k/2个数字(同样不足则取最边上的那个数字)记下标为i2
如果a[i1]<a[i2]
那么显然a[1],a[2],a[3]...a[i1]都不会是第k小的数字(因为有个a[i2]挡着他们呢).
因此我们可以把a[1],a[2]..a[i1]都删掉。
然后转换成找a,b两个有序序列的第k-i1小的数字。
否则把b[1],b[2],b[3]..b[i2]删掉就好

【代码】

class Solution {
public:
    
    int n,m;
    
    double findkth(vector<int> &nums1,vector<int> &nums2,int l1,int r1,int l2,int r2,int k){
        if (l1>r1) return nums2[l2+k-1];        
        if (l2>r2) return nums1[l1+k-1];
        if (k==1) return min(nums1[l1],nums2[l2]);
        int temp = k/2;
        int i1 = l1+temp-1;
        int i2 = l2+temp-1;
        if (i1>r1) i1 = r1;
        if (i2>r2) i2 = r2;
        if (nums1[i1]<nums2[i2]){
            //把l1..i1全删掉
            return findkth(nums1,nums2,i1+1,r1,l2,r2,k-(i1-l1+1));
        }else{
            //把l2..i2全删掉
            return findkth(nums1,nums2,l1,r1,i2+1,r2,k-(i2-l2+1));
        }
    }
    
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        n = nums1.size();m = nums2.size();
        if ((n+m)%2==1){
            return findkth(nums1,nums2,0,n-1,0,m-1,(n+m+1)/2);
        }else{
            double temp = findkth(nums1,nums2,0,n-1,0,m-1,(n+m)/2);
            temp+=findkth(nums1,nums2,0,n-1,0,m-1,(n+m)/2+1);
            temp/=2;
            return temp;
        }
    }
};

【LeetCode 4】寻找两个有序数组的中位数

标签:定位   +=   序列   链接   第k小   转换   com   amp   ndk   

原文地址:https://www.cnblogs.com/AWCXV/p/11779652.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!