高效查找两个有序数组的中位数 - C++实现与解析

给定两个有序整数数组,长度均为 n,如何找到这两个数组的中位数?

例如:

输入描述 a:[1,3,5] b:[2,4,6] 输出描述: 3.5

以下是用 C++ 语言实现的代码示例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    int n = nums1.size() + nums2.size();
    vector<int> merged(n);
    merge(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), merged.begin());
    if (n % 2 == 0) {
        return (merged[n / 2 - 1] + merged[n / 2]) / 2.0;
    } else {
        return merged[n / 2];
    }
}

int main() {
    vector<int> nums1 = {1, 3, 5};
    vector<int> nums2 = {2, 4, 6};
    
    double median = findMedianSortedArrays(nums1, nums2);
    cout << median << endl;
    
    return 0;
}

在这个示例中,我们首先将两个有序数组合并到一个新的数组中,通过使用 merge 函数来实现。merge 函数会将两个有序的输入范围合并到输出中。

然后,我们根据新数组的长度来确定中位数的位置。如果长度是偶数,中位数是位于数组中间两个数的平均值;如果长度是奇数,中位数是位于数组中间的数。

在输入的示例中,输出为 3.5,即两个有序数组的中位数。

时间复杂度分析:

此解决方案的时间复杂度为 O(n),其中 n 是两个有序数组的长度之和,因为我们需要遍历一遍所有元素来合并数组。

更高效的解决方案:

更高效的解决方案可以使用二分查找算法,将时间复杂度降低到 O(log n)。二分查找的思路是利用数组的有序性,每次比较两个数组的中间元素,逐步缩小搜索范围,最终找到中位数。 虽然代码更复杂,但能显著提高效率,尤其是在处理大规模数组时。

高效查找两个有序数组的中位数 - C++实现与解析

原文地址: https://www.cveoy.top/t/topic/KH0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录