leetcode 4 --- 寻找两个有序数组的中位数

1 题目

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。

进阶:设计一个时间复杂度为 O(log (m+n)) 的算法.

2 解法

这个题如果m+n是偶数, 就是找到第(m+n)/2以及第(m+n)/2 + 1个数, 如果是奇数, 那么就是第(m+n +1)/2个数.

2.1 普通解法

2.1.1 思路

因为两个序列都是排好序的, 那就按照双指针法找当前两个序列中更小的数

2.1.2 代码

太笨了...毕竟这不是时间复杂度为log(m+n)的方法, 也就不优化了:

class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {double result = 0.0;int nums1_size = nums1.size();int nums2_size = nums2.size();int nums1_offset = 0;int nums2_offset = 0;bool total_num_odd = ((nums1_size + nums2_size) % 2 == 0 ? false : true);int target_index = (nums1_size + nums2_size - 1) / 2;while (nums1_offset < nums1_size && nums2_offset < nums2_size && target_index) {if (nums1[nums1_offset] <= nums2[nums2_offset]) {nums1_offset ++;} else {nums2_offset ++;}target_index --;}if (nums1_offset == nums1_size) {if (total_num_odd) {result = (double)nums2[target_index + nums2_offset];} else {result = (double)((nums2[target_index + nums2_offset] + nums2[target_index + nums2_offset + 1]) / 2.0);}} else if (nums2_offset == nums2_size) {if (total_num_odd) {result = (double)nums1[target_index + nums1_offset];} else {result = (double)((nums1[target_index + nums1_offset] + nums1[target_index + nums1_offset + 1]) / 2.0);}} else {if (total_num_odd) {result = (double)(nums1[nums1_offset] < nums2[nums2_offset] ? nums1[nums1_offset] : nums2[nums2_offset]);} else {if (nums1[nums1_offset] < nums2[nums2_offset]) {if (nums1_offset + 1 < nums1_size && nums1[nums1_offset + 1] < nums2[nums2_offset]) {result = (double)((nums1[nums1_offset] + nums1[nums1_offset + 1]) / 2.0);} else {result = (double)((nums1[nums1_offset] + nums2[nums2_offset]) / 2.0);}} else {if (nums2_offset + 1 < nums2_size && nums2[nums2_offset + 1] < nums1[nums1_offset]) {result = (double)((nums2[nums2_offset] + nums2[nums2_offset + 1]) / 2.0);} else {result = (double)((nums1[nums1_offset] + nums2[nums2_offset]) / 2.0);}}}}return result;}
};

这种解法的时间复杂度是o(m + n). 

2.2 时间复杂度o(log(m+n))解法

2.2.1 思路

既然涉及到时间复杂度是o(log(m+n)), 就要用到二分法了. 感觉这样做坑挺多. 后来看了标准答案, 跳出对比两个序列中位数的固有思维, 转而寻找整个序列的第K的数, 如果m + n是奇数, 那么就是要寻找 (m + n) / 2, 如果m + n是偶数, 那么就要找(m + n) / 2  - 1和(m + n) / 2.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 142 --- linked-list-cycle-ii

1 题目&#xff1a; 对于一个给定的链表&#xff0c;返回环的入口节点&#xff0c;如果没有环&#xff0c;返回null 拓展&#xff1a; 你能给出不利用额外空间的解法么&#xff1f; 代码&#xff1a; class Solution { public:ListNode *detectCycle(ListNode *head) {} …

百度搜索引擎优化指南3.0_深圳网站搜索引擎排名优化电话,百度优化排名费用_华阳网络...

天津华阳在线科技有限公司为您详细解读深圳网站搜索引擎排名优化电话,百度优化排名费用的相关知识与详情&#xff1a;网站的主页标题是百度SEO的关键。你想要的主要关键词应该反映在标题中。如果标题写得好&#xff0c;百度很快就收录进去了。但要记住&#xff0c;有一点&#…

C++ STL 容器的一些总结 --- set(multiset)和map(multimap)

1 set和multiset 1.1 插入元素方式 set只能用insert插入数据. insert返回值是一个pair<iterator, bool>, 即插入数据的迭代器以及是否插入成功, multiset返回的只有迭代器, 因为不会插入失败. 1.2 删除 set只能用erase, 可以传迭代器或者是值. 1.3 注意事项 不允许…

苹果自带相册打马赛克_剪映app怎么给视频局部打马赛克

剪映app怎么给视频局部打马赛克呢&#xff1f;很多用户对此还不是很清楚&#xff0c;小编这里就给大家带来有关剪映app怎么给视频局部打马赛克的回答&#xff0c;希望能够对大家有所帮助。1、首先打开剪映app&#xff0c;进入首页后点击开始创作选项&#xff0c;2、这时选择需要…

excel表格如何转换成word表格_如何将excel转换成pdf?excel表格可以变成pdf文件吗?...

文字使用word&#xff0c;数据使用Excel&#xff0c;这应该是咱们日常生活中的一个规律了吧&#xff1f;不过不管是word文档还是Excel文档&#xff0c;都是可以被编辑修改的&#xff0c;那么我们怎么才能让它变得不能被编辑修改呢&#xff1f;小编这里还真有一个好方法&#xf…

python车牌识别系统开源代码_天津谁做车牌识别系统供应商,伸缩栅栏门_郑州荣锋科技有限公司...

首页 > 新闻中心发布时间&#xff1a;2020-11-13 22:54:57 导读&#xff1a;郑州荣锋科技有限公司为您提供天津谁做车牌识别系统供应商,伸缩栅栏门的相关知识与详情&#xff1a; (1)门处于关闭状态&#xff0c;控制器应骆动执行电机以佳速度曲线打开门;圆弧形自动门卷帘门机…

收发一体超声波测距离传感器模块_一文了解超声波液位计

为什么选择超声波液位计&#xff1f;因为&#xff0c;超声波液位计由声波的发射和接收之间的时间来计算传感器到被测物体的距离。无机械可动部分&#xff0c;可靠性高&#xff0c;安装简单、方便&#xff0c;属于非接触测量&#xff0c;且不受液体的粘度、密度等影响精度比较低…

什么牌子的平板电脑好_平板电脑什么牌子好?带你一探年度最佳平板的奥秘

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以免费收到最新内容了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。声明&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系…

ieee754浮点数转换工具_关于JS浮点数运算不精确的原因和解决方案

背景之前在一个项目中&#xff0c;涉及到了金额&#xff0c;协议组定的标准是按照分的单位进行传递的&#xff0c;但是交互上&#xff0c;web页面中为了更友好的体验&#xff0c;是使用的元作为单位的&#xff0c;这个时候就需要转换一下单位本来是很简单的一个转化的需求&…

fir滤波器matlab实现_关于FIRamp;IIR系统的算法说明以及结果验证(1)

首先&#xff0c;做一个简短的开场白。本贴主要是一个关于信号处理方面的学习笔记。主要目的有三&#xff0c;作为研究笔记留存分享我个人的理解与专业人士进行意见交换另外由于楼主不是教课员&#xff0c;因此无法保证算法分析以及个人理解的完全正确性&#xff0c;若本人对知…

操作系统中的全局页面置换算法

1 全局页面置换算法 以上页面置换算法都是针对单一的应用程序的页面置换算法, 且有一个前提, 就是给单一应用程序分配的物理页帧数量是一定的. 现实中, 给一个应用程序分配的物理页帧数, 该程序产生的缺页中断也就越少, 而且程序运行过程中, 可能某些阶段对于内存的读写操作很…

怎么更新opengl.dll文件_安装累积更新丢文件似乎已成为惯例 KB4556799同样出现文件丢失问题...

从 Windows 10 Version 1903 版发布开始就经常出现用户升级版本或者安装累积更新导致个人文件丢失的问题。但是以前这种问题似乎并不算频繁&#xff0c;然而从今年开始微软发布的累积更新几乎都存在这样的问题让很多用户苦恼。而微软至今从未承认过安装累积更新会丢失用户的个人…

非全局页面置换算法

1 先进先出算法(FIFO) 1.1 基本思路: 选择在内存中驻留时间最长的页面并淘汰之. 具体来说, 系统维护着一个链表, 记录了所有位于内存当中的逻辑页面. 从链表的排列顺序来看, 链首页面的驻留时间最长, 链尾页面的驻留时间最短. 当发生一个缺页中断时, 把链首页面的淘汰出局, 并…

github打开前端样式丢失_工具资源系列之 github 上各式各样的小徽章从何而来?...

前言平时大家在在逛 github 时或多或少都看到过项目首页各式各样的小徽章,不知道你是否和我一样好奇这些小徽章都是哪来的呢?首先我们先来一睹为快目前前端开发的三大主流框架: var ,看一看他们的 github 项目首页有哪些小徽章吧!小结:前端三大框架的徽章均不相同,由此可见,这…

vs code ipynb文件_UE4引擎 源码的获取、安装,以及VS配置

1.首先我们需要注册一个Epic账户&#xff0c;网址如下http://api.unrealengine.com/CHN/GettingStarted/Installation/index.html#bookmark12.创建GitHub账户https://github.com/3.登录UE4社区点击个人进入到个人之后点击连接的账户&#xff0c;之后在下面填写我们GITHUB的昵称…

js bind 传参、_js中的面向对象(一)

面向对象要解决的问题提到面向对象&#xff0c;大家的第一反应就是封装、继承和多态。对其做如下解释&#xff1a;封装&#xff1a;影藏细节&#xff08;A对A——将多行代码取个名字或A对B——API调用合作&#xff09;继承&#xff1a;继承的意思就是同上跟上述一样&#xff0c…

计算机网络中的物理层

1 基础概念 物理层解决如何在链接各种计算机的传输媒体上传输数据比特流, 而不是指具体的传输媒体. 物理层的主要任务, 确定与传输媒体接口有关的一些特性. -> 定义标准 1.1 物理层规定的特性: 机械特性: 定义物理连接的特性, 规定物理连接时所采用的规格, 接口形状, 引…

二元置信椭圆r语言_医学统计与R语言:多分类logistic回归HosmerLemeshow拟合优度检验...

微信公众号&#xff1a;医学统计与R语言如果你觉得对你有帮助&#xff0c;欢迎转发输入1&#xff1a;multinominal logistic regression "nnet")结果1&#xff1a; test (multinomial model)输入2&#xff1a;ordinal logistic regression "MASS")结果2&am…

python3.7.2安装与配置_python3.7.0 安装与配置

python 3.7.0 X64下载地址&#xff1a; https://www.python.org/ftp/python/3.7.0/python-3.7.0-amd64.exe 更多版本下载请移步到&#xff1a;https://www.python.org/downloads/release/python-370/ python可以在同一台机器上进行多版本的安装使用。 安装好python3.7.0后确认系…

操作系统处理器调度

1 背景 1.1 上下文切换: 切换CPU的当前任务, 从一个进程/线程到另一个保存当前进程/线程在PCB/TCB中的执行上下文(CPU状态)读取下一个进程/线程的上下文 1.2 CPU调度: 从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程调度程序: 挑选进程/线程的内核函数(通过…