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

ops/2024/9/24 0:29:33/

题目描述

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遍即可。

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

代码

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));}};

http://www.ppmy.cn/ops/31689.html

相关文章

python实现2路归并排序

归并排序是通过序列的合并来实现排序的。 对于一个序列a1 a2 a2 … an&#xff0c;我们可以首先把它们看成一系列的只有一个元素的有序子序列a1;a2;a3;…;an&#xff0c;我们让a1和a2合并&#xff0c;a3和a4合并&#xff0c;依次类推&#xff0c;最后得到一个有序子序列的序列a…

eNSP-抓包解析HTTP、FTP、DNS协议

一、环境搭建 1.http服务器搭建 2.FTP服务器搭建 3.DNS服务器搭建 二、抓包 三、http协议 1.HTTP协议&#xff0c;建立在TCP协议之上 2.http请求 3.http响应 请求响应报文参考&#xff1a;https://it-chengzi.blog.csdn.net/article/details/113809803 4.浏览器开发者工具抓包…

简化Transformer模型,以更少的参数实现更快的训练速度

在深度学习领域&#xff0c;Transformer模型因其卓越的性能而广受欢迎&#xff0c;但其复杂的架构也带来了训练时间长和参数数量多的挑战。ETH Zurich的研究人员Bobby He和Thomas Hofmann在最新研究中提出了一种简化的Transformer模型&#xff0c;通过移除一些非必要的组件&…

华为试题之删除最少字符

题目描述 删除字符串中出现次数最少的字符 如果多个字符出现次数一样则都删除 输入描述 输入只包含小写字母 输出描述 输出删除后剩余的字符 若删除后字符串长度为0&#xff0c;则输出empty 我的思路是将字符串中的字符对应的数量和key统计后放到对应的字典中&#xff0c; 对字…

Docker - 修改服务的端口

1. 测试 新建一个httpd服务 docker run -itd -p 1314:80 --name test -h test httpd 2. 先停止容器和 docke r服务 docker stop test #停止容器3. 修改配置 cd /var/lib/docker/containers ls 找到需要修改的 cd 1fc55f0d24014217cff68c9a417ca46cf50312caa5c9e6bb24085126…

蓝桥杯国赛备赛复习——数据结构

一、链表 1.1 单链表 package 链表;public class 单链表 {static int e[] new int[11010]; // index号节点的value值&#xff08;value&#xff09;static int ne[] new int[11010];// index号节点的下一个节点的index&#xff08;nextNode&#xff09;static int head-1,i…

windows ubuntu sed,awk,grep篇,8,Awk 语法和基础命令

目录 51.Awk 命令语法 52.Awk 程序结构(BEGIN,body,END)区域 53.打印命令 54.模式匹配 Awk 是一个维护和处理文本数据文件的强大语言。在文本数据有一定的格式&#xff0c;即每行数据包 含多个以分界符分隔的字段时&#xff0c;显得尤其有用。即便是输入文件没有一定的格式&a…

深入探索Element-UI:构建高效Web前端的利器

深入探索Element-UI&#xff1a;构建高效Web前端的利器 引言&#xff1a;前端框架的选择与Element-UI的定位一、Element-UI初探二、快速上手&#xff1a;安装与配置三、核心组件深度解析四、实用功能与进阶技巧五、性能优化与最佳实践六、实战案例分析七、与其他技术栈的集成 安…