标签 hard 下的文章

题目链接:寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

方法一:二分

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        if (nums1.size() > nums2.size()) return findMedianSortedArrays(nums2,nums1);
        int m = nums1.size();
        int n = nums2.size();
        int half = (m+n+1)/2;
        int l = -1,r = m+1;
        while (l + 1 < r) {
            int mid1 = (l+r) / 2;
            int mid2 = half - mid1;
            int A_left = (mid1 == 0) ? INT_MIN : nums1[mid1-1];
            int A_right = (mid1 == m) ? INT_MAX : nums1[mid1];

            int B_left = (mid2 == 0) ? INT_MIN : nums2[mid2-1];
            int B_right = (mid2 == n) ? INT_MAX : nums2[mid2];

            if (A_left <= B_right && B_left <= A_right) {
                int leftMax = max(A_left,B_left);
                if ((m+n) % 2 == 1) {
                    return (double)leftMax;
                }
                int rightMin = min(A_right, B_right);
                return (leftMax + rightMin) / 2.0;
            }else if(A_left > B_right) {
                r = mid1;
            }else {
                l = mid1;
            }
        }
        return 0.0;
    }
};