leetcode 4. Median of Two Sorted Arrays

题目

就是找两个有序list的中间值

其实就是两个list 合一就可以了
题目给我们一个list, 我们可以往后移动一下 这样[0]位置的元素代表INT_MIN, 然后中间是 [1, len(list)] 这个是当前的list, 然后 > len(list) 就是INT_MAX
这样我们就可以表示出来

num1 num2
num3 num4

我们要保证中间值是 num1和num3的较大者, 由于num1 <= num2 && num3 <= num4
我们仅仅需要保证 num1<=num4 && num3 <= num2就可以得到最后的中间值
所以二分check一下就可以了

题解

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int k1 = nums1.size(), k2 = nums2.size();
        if(k1 < k2)
            return findMedianSortedArrays(nums2, nums1);
        int K = k1 + k2;
        int MED = (K+1)/2;
        int l = 0, r = k1;
        int n1, n2, n3, n4;
        while(l <= r) {
            int m1 = (l+r)/2;
            int m2 = MED - m1;
            
            n1 = (m1 <= 0) ? INT_MIN : (m1 > k1) ? INT_MAX : nums1[m1-1];
            n2 = (m1+1 <= 0) ? INT_MIN : (m1+1 > k1) ? INT_MAX : nums1[m1];
            n3 = (m2 <= 0) ? INT_MIN : (m2 > k2) ? INT_MAX : nums2[m2-1];
            n4 = (m2+1 <= 0) ? INT_MIN : (m2+1 > k2) ? INT_MAX : nums2[m2]; 
            
            if(n1 <= n4 && n3 <= n2)
                break;
            else if(n1 > n4)
                r = m1 - 1;
            else 
                l = m1 + 1;
        }
        if (K & 1) {
            return max(n1, n3);
        } else {
            return 1.0 * (max(n1, n3) + min(n2, n4)) / 2;
        }
    }
};
posted @ 2019-07-22 11:35  Draymonder  阅读(126)  评论(0编辑  收藏  举报