Median of Two Sorted Arrays

题目来源
给定两个有序数组,求其中位数,这道题之前做过,而且在微软面试的时候还面过。知道大概是利用二分的方法来做的,但是写代码就是写不出来。
然后就看了下讨论区的大神做法,大神们把两个数组都填充下,N个元素的数组变成2N+1长度。例如1 2 3 变成# 1 # 2 # 3 #
然后这样的话不管数组是奇数还是偶数长度处理起来就都一样了。
代码非常简单,如下,主要是维持两个mid,使得两个mid左边的数目和右边的数目一样,然后主要看mid2,就是比较短的那个串,另一个的话直接n1+n2-mid2就可以了。
然后就是l1, l2, r1, r2的维持,需要判断一下l是否是为0以及r是否是最末尾。
注意结果应该是double类型。

class Solution {
public:
    double findMedianSortedArrays(vector& nums1, vector& nums2) {
        int n1 = nums1.size(), n2 = nums2.size();
        if (n1 < n2)
            return findMedianSortedArrays(nums2, nums1);
        int lo = 0, hi = 2 * n2;
        while (lo <= hi) {
            int mid2 = (lo + hi) / 2;
            int mid1 = n1 + n2 - mid2;
            int l1 = (mid1 == 0) ? INT_MIN : nums[(mid1 - 1) / 2];
            int l2 = (mid2 == 0) ? INT_MIN : nums[(mid2 - 1) / 2];
            int r1 = (mid1 == n1 * 2) ? INT_MAX : nums[mid1 / 2];
            int r2 = (mid2 == n2 * 2) ? INT_MAX : nums[mid2 / 2];
            if (l1 > r2)
                lo = mid1 + 1;
            else if (l2 > r1)
                hi = mid1 - 1;
            else
                return (max(l1, l2) + min(r1, r2)) / 2;
        }
        return -1;
    }
};

你可能感兴趣的:(Median of Two Sorted Arrays)