美文网首页
Median of Two Sorted Arrays

Median of Two Sorted Arrays

作者: 我叫胆小我喜欢小心 | 来源:发表于2017-08-06 14:26 被阅读21次

    题目来源
    给定两个有序数组,求其中位数,这道题之前做过,而且在微软面试的时候还面过。知道大概是利用二分的方法来做的,但是写代码就是写不出来。
    然后就看了下讨论区的大神做法,大神们把两个数组都填充下,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<int>& nums1, vector<int>& 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

          本文链接:https://www.haomeiwen.com/subject/nwgglxtx.html