寻找两个正序数组的中位数

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

进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

 

示例 1:

输入:nums1 = [1,3], nums2 = [2]

输出:2.00000

解释:合并数组 = [1,2,3] ,中位数 

 

 

#include <vector>
#include <iostream>

using namespace std;

class Solution {
public:
    double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2) {
        int n = nums1.size();
        int m = nums2.size();
        vector<int> &shorter = n <= m ? nums1 : nums2;
        vector<int> &longer = n <= m ? nums2 : nums1;
        int pivot = (n + m + 1) / 2;
        int i, j;
        for (i = 0; j = pivot - i, i < shorter.size(); ++i) {
            if (shorter[i] >= longer[j - 1])
                break;
        }
        if ((n + m) % 2 == 1) {
            if (i == 0)
                return (double) longer[j - 1];
            else {
                return (double) shorter[i - 1] > longer[j - 1] ? shorter[i - 1] : longer[j - 1];
            }
        } else {
            int left, right;
            if (i == 0)
                left = longer[j - 1];
            else {
                if (j == 0)
                    left = shorter[i - 1];
                else
                    left = shorter[i - 1] > longer[j - 1] ? shorter[i - 1] : longer[j - 1];
            }
            if (i == shorter.size())
                right = longer[j];
            else {
                if (j == longer.size())
                    right = shorter[i];
                else
                    right = shorter[i] < longer[j] ? shorter[i] : longer[j];
            }
            return ((double) left + (double) right) / 2;
        }
    }
};

int main() {
    vector<int> nums1{1, 2};
    vector<int> nums2{3, 4};
    Solution s;
    cout << s.findMedianSortedArrays(nums1, nums2) << endl;
}

 

  

posted on 2021-02-20 11:07  QzZq  阅读(35)  评论(0)    收藏  举报

导航