4. 寻找两个正序数组的中位数(C++)

题目描述:

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。

请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

 

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0
示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

 

思想:二分法求第k小数字

参考 https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-2/ 解法三

代码:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        int m = nums2.size();
        int left = (m + n + 1) / 2;
        int right = (m + n + 2) / 2;
        return (getKth(nums1,0,n-1,nums2,0,m-1,left) + getKth(nums1,0,n-1,nums2,0,m-1,right)) / 2;   // 统一奇数与偶数
    }
    double getKth(vector<int>& nums1,int start1,int end1,vector<int>& nums2,int start2,int end2,int k){
        int len1 = end1 - start1 + 1;
        int len2 = end2 - start2 + 1;
        if(len1>len2)
            return getKth(nums2,start2,end2,nums1,start1,end1,k);
        if(len1 == 0)
            return nums2[start2 + k - 1];
        if(k == 1)
            return min(nums1[start1],nums2[start2]);
        int i = start1 + min(len1,k/2) - 1;
        int j = start2 + min(len2,k/2) - 1; 
        if(nums1[i] > nums2[j])
            return getKth(nums1,start1,end1,nums2,j+1,end2,k-(j-start2+1));
        else
            return getKth(nums1,i+1,end1,nums2,start2,end2,k-(i-start1+1));
    }
};

 

posted @ 2020-05-14 14:10  thefatcat  阅读(751)  评论(0编辑  收藏  举报