寻找两个有序数组合并后的中位数

常规思路可以很简单的解决这个题

但是要求的算法时间复杂度为log2(m+n)

new数组简单双指针合并后输出=O(m+n),不达标

但是也很明显的是,可以优化移动到(m+n)/2+1处位置的时候即停止移动。

主要考虑以下几点:

双指针(x前,y后存中位数)
1.两数组合并长度奇偶性对指针移动位置的影响:
选择位置为((m + n) + 1) / 2 + 1
合并为奇数的时候输出后一位中位数y
合并为偶数的时候输出x+y的均值
2.中位数分布:
在两个数组,正常处理,
在一个数组,多一层while指针移动
m+n==1的时候,双指针并不能正常移动,特别处理

class Solution
{
public:
    double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2)
    {
        int m = nums1.size(), n = nums2.size(), o = ((m + n) + 1) / 2 + 1, i = 0, j = 0, x, y;
        if (m + n == 1)
            return m ? nums1[0] : nums2[0];
        while (i < m && j < n && i + j != o)
            y = x, x = nums1[i] < nums2[j] ? nums1[i++] : nums2[j++];
        while (i + j != o)
            y = x, x = i < m ? nums1[i++] : nums2[j++];
        return (m + n) % 2 ? y : (x + y) / 2.0;
    }
};

由于我的代码简短且(还行)优秀,就不学习官方的解法了。

posted @ 2022-03-03 21:51  Renhr  阅读(175)  评论(0)    收藏  举报