美文网首页
#4 Median of Two Sorted Arrays[H

#4 Median of Two Sorted Arrays[H

作者: BinaryWoodB | 来源:发表于2018-11-19 21:46 被阅读0次

Description

tags: Array, Binary Search, Divide and Conquer

There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:

nums1 = [1, 3]
nums2 = [2]
The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5

关键点

将题目的变量控制为只有i,转化为二分查找合适的i值。i在imin和imax之间。
i确定时j也是确定的,因为有限制条件:i + j == (m - i) + (n - j)
那么问题就简单了,二分查找在imin和imax之间的i。对于某一个特定的i,有三种情况(在不考虑edge case时),分别是:

  1. A[i-1] <= B[j],B[j] <= A[i]刚好满足条件,找到我们要的i
  2. A[i-1] > B[j],i需要左移。令imax = i - 1
  3. B[j -1] > A[i],i需要右移。令imin = i+1

My solution

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        // ensure nums1(m elems) is the shorter one. m <= n
        if (nums1.size() > nums2.size()) {
            nums1.swap(nums2);
        }
        int m = nums1.size();
        int n = nums2.size();
        
        int low = 0, high = m;
        double median = 0;
        bool isEven = ((m + n) % 2 == 0 ? true : false);
        while (low <= high) {
            int i = (low + high) / 2;
            int j = (m + n) / 2 - i;
            if (j < n && i > 0 && nums1[i-1] > nums2[j]) {
                high = i - 1; // i is too small
            } 
            else if (i < m && j > 0 && nums1[i] < nums2[j-1]) {
                low = i + 1; // i is too big
            } 
            else {
                double rightMin = 0, leftMax = 0;
                
                if (i == 0) leftMax = nums2[j-1];
                else if (j == 0) leftMax = nums1[i-1];
                else leftMax = max(nums1[i-1], nums2[j-1]);
                
                if (i == m) rightMin = nums2[j];
                else if (j == n) rightMin = nums1[i];
                else rightMin = min(nums1[i], nums2[j]);
                
                median = isEven ? (leftMax + rightMin) / 2 : rightMin;
                return median;
            }
        }
        
        return 0.0;        
    }
};

Point

这题太难了。。。要反复做。。好好理解条件判断。。。TAT

相关文章

网友评论

      本文标题:#4 Median of Two Sorted Arrays[H

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