Leetcode——两个有序数组找中位数

使用二分分割法

cpp 复制代码
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
using namespace std;

class Solution {
public:
    static double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2) {
        if (nums1.size() > nums2.size()) swap(nums1, nums2);
        int m = static_cast<int>(nums1.size());
        int n = static_cast<int>(nums2.size());
        int left = 0, right = m;

        while (left <= right) {
            int i = (left + right) / 2;
            int j = (m + n + 1) / 2 - i; // 左半总数 = ceil((m+n)/2) = 5

            int l1 = (i == 0) ? INT_MIN : nums1[i - 1];
            int r1 = (i == m) ? INT_MAX : nums1[i];
            int l2 = (j == 0) ? INT_MIN : nums2[j - 1];
            int r2 = (j == n) ? INT_MAX : nums2[j];

            if (l1 <= r2 && l2 <= r1) {
                if ((m + n) % 2 == 1) {
                    return max(l1, l2); // 第5小 = 左半最大值
                } else {
                    return (max(l1, l2) + min(r1, r2)) / 2.0;
                }
            } else if (l1 > r2) {
                right = i - 1;
            } else {
                left = i + 1;
            }
        }
        return 0.0;
    }
};

int main() {
    vector<int> nums1 = {1, 2, 5, 6};
    vector<int> nums2 = {3, 4, 7, 8, 9};

    const double median = Solution::findMedianSortedArrays(nums1, nums2);

    // 手动验证:合并后为 [1,2,3,4,5,6,7,8,9] → 中位数是 5
    cout << "nums1: [1, 2, 5, 6]" << endl;
    cout << "nums2: [3, 4, 7, 8, 9]" << endl;
    cout << "合并后: [1, 2, 3, 4, 5, 6, 7, 8, 9]" << endl;
    cout << "中位数是: " << median << endl;

    return 0;
}