4. Median of Two Sorted Array

题目:

解答:

如果是允许使用额外空间,做一次额外merge操作即可,解答过程比较方便,复杂度为O(n),参见解答一

如果是不允许使用额外空间,那么只能二分查找两个数组,参见解答二,是别人写的。。。

代码:

// 解答一
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int len1 = nums1.size(), len2 = nums2.size();
        vector<int> num(len1 + len2);
        int index1 = 0, index2 = 0;
        for(int i = 0;i < len1 + len2; ++i){
            num[i] = index1 < len1 ? (index2 < len2 ? nums1[index1] > nums2[index2] ? nums2[index2++] : nums1[index1++]: nums1[index1++]) : nums2[index2++];
        }
        return (len1 + len2) % 2 == 0 ? 1.0 * (num[(len1 + len2)/2] + num[(len1+len2)/2 - 1]) /2: 1.0 * num[(len1+len2)/2];
    }
};
// 解答二
class Solution {
 public:
  double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2) {
    int l1 = nums1.size(), l2 = nums2.size();
    if (l1 > l2)
      return findMedianSortedArrays(nums2, nums1);

    int tot_left = (l1 + l2) >> 1, start = 0, end = l1;
    int cut_pos1 = (start + end) >> 1, cut_pos2 = tot_left - cut_pos1;
    int max_left, min_right;
    while (1) {
      if (cut_pos1 != 0 && nums1[cut_pos1 - 1] > nums2[cut_pos2])
        end = cut_pos1 - 1;
      else if (cut_pos1 != l1 && nums1[cut_pos1] < nums2[cut_pos2 - 1])
        start = cut_pos1 + 1;
      else
        break;
      cut_pos1 = (start + end) >> 1;
      cut_pos2 = tot_left - cut_pos1;
    }

    if (cut_pos1 == l1)
      min_right = nums2[cut_pos2];
    else if (cut_pos2 == l2)
      min_right = nums1[cut_pos1];
    else
      min_right = std::min(nums1[cut_pos1], nums2[cut_pos2]);
    if ((l1 + l2) % 2)
      return min_right;

    if (cut_pos1 == 0)
      max_left = nums2[cut_pos2 - 1];
    else if (cut_pos2 == 0)
      max_left = nums1[cut_pos1 - 1];
    else
      max_left = std::max(nums1[cut_pos1 - 1], nums2[cut_pos2 - 1]);
    return 1.0 * (max_left + min_right) / 2;
  }
};

猜你喜欢

转载自blog.csdn.net/u013434984/article/details/83894188
今日推荐