C++算法:寻找两个有序数组的中位数----归并排序

这篇博客介绍了如何在C++中利用归并排序算法寻找两个已排序数组的中位数。通过将数组归并成一个有序序列,然后在O(log(m+n))的时间复杂度内找到中位数。文中给出了特殊情况的处理方法,如一个数组为空,以及具体的C++代码实现。
摘要由CSDN通过智能技术生成

leetcode相关C++算法解答: https://github.com/Nereus-Minos/C_plus_plus-leetcode

题目:

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。

示例 1

:nums1 = [1, 3] nums2 = [2] 则中位数是 2.0

示例 2:

nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5

思路;

(使用归并排序)如果输入是一个有序序列,找到其中位数,应该是一个很简单的问题。但现在的输入是两个有序序列。 所以,要解决的第一个问题就是如何将两个有序序列合并成一个有序序列。 在考虑要求的时间复杂度的为O(log(m+n))的情况下,应考虑使用归并排序。归并排序的时间复杂度恰为O(log(m+n))。 所以,本题的解题思路为,先利用归并排序将两个有序序列合并为一个有序序列。然后求其中位数。
1.特殊情况:有一个为空,则直接求中位数
2.都存在时,先将两vector归并到一个vector中,然后求其中位数。

代码:

class Solution {
public:
    double findMe
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
题目描述: 给定两个长度分别为m和n的有序序列,中位数。 输入格式: 第一行输入一个整数m,表示第一个有序序列的长度。 第二行输入m个整数,表示第一个有序序列。 第三行输入一个整数n,表示第二个有序序列的长度。 第四行输入n个整数,表示第二个有序序列。 输出格式: 输出一个整数,表示两个有序序列的中位数。 输入样例: 5 1 3 5 7 9 6 2 4 6 8 10 12 输出样例: 7 算法1: (二分查找) $O(log(min(m,n)))$ 1.先确定中位数的位置,如果m+n为奇数,则中位数位置为(m+n+1)/2,如果为偶数,则中位数位置为(m+n)/2和(m+n)/2+1。 2.在两个有序序列中分别进行二分查找,找到第一个序列中第k/2个数和第二个序列中第k/2个数,比较两个数的大小,如果第一个序列中的数小,则第一个序列中前k/2个数都不可能是中位数,将第一个序列中前k/2个数舍去,更新k值,继续在剩下的数中查找中位数。 3.重复步骤2,直到找到中位数。 时间复杂度 二分查找的时间复杂度为O(log(min(m,n))),因此总时间复杂度为O(log(min(m,n)))。 C++ 代码 算法2: (归并排序) $O(m+n)$ 1.将两个有序序列合并成一个有序序列。 2.如果合并后的序列长度为奇数,则中位数为合并后序列的中间位置的数,如果长度为偶数,则中位数为中间位置的两个数的平均值。 时间复杂度 归并排序的时间复杂度为O(m+n),因此总时间复杂度为O(m+n)。 C++ 代码
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值