LeetCode 4. Median of Two Sorted Arrays

题目要求O(log(m+n)),很自然想到二分。但是怎么二分缩小搜索区域比较tricky。找中位数,可以看成找第k个数的问题,比较两个数组第k/2个元素(奇数偶数都可),小的那个数组的前面元素都可以丢掉(不可能是第k大的元素)。

本题的corner case比较多,如k==1,len=0。而且有奇数偶数的情况,需要注意。

详见 http://windliang.cc/2018/07/18/leetCode-4-Median-of-Two-Sorted-Arrays/

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        int m = nums2.size();
        int left = (n + m + 1) / 2;
        int right = (n + m + 2) / 2;
        return (getkth(nums1, 0, n - 1, nums2, 0, m - 1, left) + getkth(nums1, 0, n - 1, nums2, 0, m - 1, right)) * 0.5;
    }
    
    int getkth(vector<int> &nums1, int start1, int end1, vector<int> &nums2, int start2, int end2, int k){
        int len1=end1-start1+1, 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 @ 2018-09-12 07:18  約束の空  阅读(118)  评论(0)    收藏  举报