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

题目描述

2个有序数组(保证不能同时为空)长度分别为m,n;求他们的中位数。

要求时间复杂度O(long(m+n))

解题思路

题目的要求可以转述为求第k大个数,k可能为1个数,可能为2个数。
k=(m+n)/2

  1. num1[k/2]表示第一个数组的第k/2个数。
  2. num2[k/2]表示第二个数组的第k/2个数。

下面进行分类讨论:

  • num1[k/2]<num2[k/2],那么只需要比较num1(k/2+1,m)和num2(0,n),且去掉了k/2个数。
  • num1[k/2]>num2[k/2],那么只需要比较num2(k/2+1,n)和num1(0,m),且去掉了k/2个数。
  • num1[k/2]=num2[k/2],该值就是答案。

每一次的比较k要进行修改。因为已经排除了k/2个数。

上述讨论没有结果就继续执行(递归或者循环)。

注意:

  • m+n为奇数,中位数1个。
  • m+n为偶数,中位数2个。

1个就找1遍,2个就找 2遍即可。

细节问题看具体的代码实现。

代码

cpp 复制代码
class Solution {

public:

    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {

        int m=nums1.size(),n=nums2.size();

        if((m+n)%2==0)

        {

            return (findMedian(nums1,nums2,0,0,(m+n)/2)+findMedian(nums1,nums2,0,0,(m+n)/2+1))/2.0;

        }

        else

        {

            return findMedian(nums1,nums2,0,0,(m+n)/2+1);

        }

    }

    int findMedian(vector<int>& nums1, vector<int>& nums2,int sp1,int sp2,int k)

    {

        //保证nums1中要查找的元素个数小于nums2中的,是为了方便对边界进行处理。

        if(nums1.size()-sp1>nums2.size()-sp2) return findMedian(nums2,nums1,sp2,sp1,k);

  

        //当k位1的时候,就是两个数组中第一个元素中的最小值

        if(k==1)

        {

            if(nums1.size()==sp1) return nums2[sp2];

            return min(nums1[sp1],nums2[sp2]);

        }

        //因为第一个数组查找的数据较小 ,容易越界

        if(nums1.size()==sp1) return nums2[sp2+k-1];

        //第一个数组,当越界的时候,只需要比较较小值即可。

        int i=min(sp1+k/2-1,(int)nums1.size()-1),j=sp2+k-k/2-1;

  

        if(nums1[i]<nums2[j]) return findMedian(nums1,nums2,i+1,sp2,k-(i-sp1+1));

        else  return findMedian(nums1,nums2,sp1,j+1,k-(j-sp2+1));

    }

};
相关推荐
浩浩测试一下1 小时前
06高级语言逻辑结构到汇编语言之逻辑结构转换 for (...; ...; ...)
汇编·数据结构·算法·安全·web安全·网络安全·安全架构
辞--忧2 小时前
K-Means 聚类算法详解与实战指南
算法·kmeans·聚类
尤超宇2 小时前
K 均值聚类(K-Means)演示,通过生成笑脸和爱心两种形状的模拟数据,展示了无监督学习中聚类算法的效果。以下是详细讲解:
算法·均值算法·聚类
qq_479875432 小时前
设置接收超时(SO_RCVTIMEO)
c语言·算法
封奚泽优2 小时前
MATLAB入门教程
数据结构·matlab·deepseek
张同学的IT技术日记2 小时前
【奇妙的数据结构世界】用图像和代码对堆栈的使用进行透彻学习 | C++
算法
野生的编程萌新4 小时前
【数据结构】从基础到实战:全面解析归并排序与计数排序
数据结构·算法·排序算法
Mercury_Lc4 小时前
【链表 - LeetCode】206. 反转链表【带ACM调试】
算法·链表
YuTaoShao4 小时前
【LeetCode 热题 100】152. 乘积最大子数组——(解法一)递推
java·算法·leetcode·职场和发展
weixin_307779135 小时前
C++进程监视器与自动启动程序
开发语言·c++·算法