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

问题

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

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

示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

分析

太难了,不会。看灵神题解吧。https://leetcode.cn/problems/median-of-two-sorted-arrays/solutions/2950686/tu-jie-xun-xu-jian-jin-cong-shuang-zhi-z-p2gd/?envType=study-plan-v2&envId=top-100-liked

代码

目前实现了灵神的第一种解法。复杂度O(n),事实上,vector的insert就已经O(n)了。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& a, vector<int>& b) {
        if (a.size() > b.size()) {
            swap(a, b); // 保证a长度小于b
        }
        int m = a.size(), n = b.size();
        a.insert(a.begin(), -1e9-10);
        b.insert(b.begin(), -1e9-10);
        a.push_back(1e9+10);
        b.push_back(1e9+10);
        // 不妨设总数奇数时,a比b多一个数
        // i, j满足i+j=(m+n+1)/2
        // 中位数:可以将一堆数字分为两组,总有第一组的最大值小于第二组的最小值
        // i和j是第一组的有边界(包含)
        for (int i = 0, j = (m+n+1)/2; ;) {
            // 假设b[j+1]是第二组的最小值,需大于第一组的最大值a[i]或者b[j],但是有b[j+1] >= b[j]恒成立
            // 也可能a[i+1]是第二组的最小值
            if (a[i] <= b[j+1] && a[i+1] >= b[j]) {
                int max1 = max(a[i], b[j]);
                int min2 = min(a[i+1], b[j+1]);
                if ((m+n) % 2 != 0) {
                    return max1;
                } else {return (max1+min2) / 2.0;}
            }
            i++; j--;
        }
    }
};
posted @ 2025-06-11 22:16  saulstavo  阅读(29)  评论(0)    收藏  举报