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

Posted Visitor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 4寻找两个有序数组的中位数相关的知识,希望对你有一定的参考价值。

题目链接

【题解】


假设在两个有序的序列中找第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寻找两个有序数组的中位数的主要内容,如果未能解决你的问题,请参考以下文章

二分 - 寻找两个有序数组的中位数 - Leetcode 4

[LeetCode] 4. 寻找两个有序数组的中位数

LeetCode 4. 寻找两个有序数组的中位数(难)

LeetCode 4. 寻找两个有序数组的中位数(难)

Leetcode寻找两个有序数组的中位数

[leetcode]4寻找两个有序数组的中位数