return两个返回值_LeetCode 第四题 寻找两个有序数组的中位数

cb62c88a96c89f83eb1b5cf6180b215b.png
给定两个大小为 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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

第四题,这次难度是困难,这是我们第一次遇到困难。

我们遇到什么困难也不要怕,微笑着面对它! 消除恐惧的最好办法就是面对恐惧! 加油!奥利给!

5eb62de20c15233c3e782eac9121673a.png

呃,串戏了

回正题,老规矩先看题干构建函数头,给定两个大小为 mn 的有序数组 nums1nums2,输入为两个有序数组即 int[] nums1 和 int[] nums2 。请你找出这两个有序数组的中位数,那返回值是一个 double (因为中位数肯能是两个数的平均值,所以会有小数位)。

public double FindMedianSortedArrays(int[] nums1, int[] nums2)

再接着读题,要求算法的时间复杂度O(log(m + n))。这里问题就来了,求两个数组的中位数不难,只要将两个数组合并,即可很容易的找出其中位数,但是要求时间复杂度是 O(log(m + n)) 又是什么鬼。时间复杂度我们知道是标识算法运算n时常与输入变量的长度相关性的标志,常见的包括 O(1)常数时间 O(n)线性时间 O(logn)对数时间 等。

题目要求我们时间复杂度为 O(log(m+n))就是要求算法为对数时间,而常见的对数时间的算法有,二分查找和一些二叉树的操作。这就是直接给了我们答案有木有。看来是要对数据进行一个二分查找的改造了(这里肯定不是二叉树,因为构建二叉树的算法复杂度已经是O(m+n)了)。

我们来看二分查找算法的百度百科定义,二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

嗯,顺序存储结构,咱们的两个数组都是有序的,这很好,二分查找的过程即为查找中间值,比较大小,如相等则是要找的值,如不相等再去相应的子表中再次进二分查找。这里我给出百度百科中的C#二分查找源码。

public static int Method(int[] nums, int low, int high, int target)
{while (low <= high){int middle = (low + high) / 2;if (target == nums[middle]){return middle;}else if (target > nums[middle]){low = middle + 1;}else if (target < nums[middle]){high = middle - 1;}}return -1;
}

那么我们需要找的是什么,中位数,再次引用百度百科定义中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。 所以我们要找的不是一个特定的值,而是一个存在于特定位置的数。所以我们只要找到特定位置上数是多少就好了。

首先我们有两条数组,假设 我们合并两条数组 nums1 nums2 = nums,那么位于 a 位置的中位数 将其分为两部分即nums[0~(a-1)] 与 nums[a~(nums.Lenght-1)] ,且s两部分的长度相同。我们设这两部分为numsLeft 与 numsRight,那么numsLeft中应包含 nums1的一部分与nums2的一部分,我们可以认为 numsLeft = nums1[0~(i-1)] + nums2[0~(j-1)],那么 numsRight = nums1[i~(nums1.Lenght-1)] + nums2[j~(nums2.Lenght-1)],这个是我们要达成的目标。并且我们可以知道 Max(numsLeft)<=Min(numsRight) ,这便是我们的判断标准。

那么看下具体的代码实现吧

public double FindMedianSortedArrays(int[] nums1, int[] nums2)
{if (nums1.Length > nums2.Length)//主操作放在长的数组上可以减少大多数情况下的算法耗时{ int[] temp = nums1;nums1 = nums2;nums2 = temp;}int minI = 0;       //i 所处位置可能的最小值int maxI = nums1.Length;        //i 所处位置可能的最大值int halfLen = (nums1.Length + nums2.Length + 1) / 2;//i的一半长度 由于int计算小数部分会被完全舍去,所以+1之后再除可以适应奇偶问题while (minI <= maxI){int i = (minI + maxI) / 2;  //在可能的范围内用二分查找法来找到正确的数值,这个是中间值int j = halfLen - i;        //找到nums2 放入numsLeft中的最大值的位置if (i < maxI && nums2[j - 1] > nums1[i]) //判断nums2 放入 numsLeft 中的最大值是否大于 nums1 放入numsRight 中的最小值{minI = i + 1; // i 这个中间值小了,我们调整 i 的范围}else if (i > minI && nums1[i - 1] > nums2[j])//判断nums2 放入 numsRight 中的最小值是否小于 nums1 放入numsLeft 中的最大值{maxI = i - 1; //  i 这个中间值大了,我们调整 i 的范围}else //i值是正确的值{int maxLeft; //找到左侧最大值if (i == 0){maxLeft = nums2[j - 1]; }else if (j == 0) {maxLeft = nums1[i - 1]; }else {maxLeft = Math.Max(nums1[i - 1], nums2[j - 1]); }if ((nums1.Length + nums2.Length) % 2 == 1) { return maxLeft; }
​int minRight; //找到右侧最小值if (i == nums1.Length) {minRight = nums2[j]; }else if (j == nums2.Length) {minRight = nums1[i]; }else { minRight = Math.Min(nums2[j], nums1[i]); }
​return (maxLeft + minRight) / 2.0;}}return 0.0;
}

跑一下

执行用时 :128 ms, 在所有 C# 提交中击败了99.21%的用户

内存消耗 :26.9 MB, 在所有 C# 提交中击败了5.05%的用户

效率不错。这个代码我原来自己写的比较乱,讲起来比较麻烦我又参考了LeetCode官方给出的答案进行了少许的修改。我们学习就是这样,自己不会的有好的指导就应该去学,学习永远是最值得骄傲的。

好了,这是我第一次讲解困难难度的题目,有不清楚的地方大家可以在留言里提出,我会尽量给大家回复并讲解清楚的。那么就让我们一起努力吧!

97ec5aa776ab94d637e27f9ef63437e8.png
想了解更多,扫码关注我的公众号 IP的dotNet吧

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

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

相关文章

intellij 使用_使用IntelliJ书签

intellij 使用这是有关IntelliJ的精美书签功能的快速帖子。 IntelliJ使您可以为单行代码添加书签。 将某行添加为书签后&#xff0c;您可以使用多种方法直接跳回该行。 因此&#xff0c;最好在您经常使用的代码位置添加书签。 要创建一个新书签&#xff0c;只需在代码编辑器中…

[即将举行的网络研讨会]对Kubernetes进行故障排除:您需要具备的7个关键组件

如果您没有听说过&#xff0c;那么容器正在吞噬整个世界。 这种转变正在改变我们在开发&#xff0c;交付和维护应用程序方面所知的一切&#xff0c;尤其是在解决错误方面。 有这么多动人的东西&#xff0c;让您难以发现潜伏在基于Kubernetes的应用程序中的关键问题。 传统的故…

php能打开.shp文件吗,shp文件是什么格式的

shape文件由ESRI开发&#xff0c;一个ESRI的shape文件包括一个主文件&#xff0c;一个索引文件&#xff0c;和一个dBASE表。其中主文件的后缀就是【.shp】。本文操作环境&#xff1a;Windows7系统&#xff0c;Dell G3电脑。shape文件由ESRI开发&#xff0c;一个ESRI(Environmen…

成为Java流大师–第5部分:将联接的数据库表转换为流

是否可以将联接的数据库表转换为Java Stream&#xff1f; 答案是肯定的。 既然我们已经多次提出这个问题&#xff0c;我们决定写另一篇动手实验文章&#xff0c;解释如何执行更高级的Stream Joins。 因此&#xff0c;这里是第六篇中的第五篇&#xff0c;后面还有一个GitHub存储…

mysql数据库java链接,java链接MySQL数据库方法

第一步&#xff1a;安装MySQL这步我就很少说了&#xff0c;点击去看看怎么安装吧。html第二步&#xff1a;建立数据库安装好以后&#xff0c;咱们来建立一个数据库&#xff0c;一个表。(代码以下)。//建立数据库 test&#xff1b;//在数据库中建立表 user//插入一条数据create …

matlab虚线分格线,虚线实线网格线……一分钟看懂路面标志线,不再被扣分!

黄色实线黄色实线用来区分不同方向的车道&#xff0c;一般画在马路正中间&#xff0c;车道多的路面上就是双黄线&#xff0c;车道少的路面上则用单黄线。而无论单黄线还是双黄线&#xff0c;均严格禁止车辆跨越&#xff0c;因此压线行驶、超车或者掉头等都是不允许的。黄色虚线…

python 判断列表为空_Python 判断列表为空

原博文 2020-06-05 12:38 − https://mp.weixin.qq.com/s?__bizMzU2MDQwOTU0MA&mid2247483845&idx1&sndaf1d3661b4e6b6a15dbe40c7f9c0e14&chksmfc093f6ecb7eb678c22e3... 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序设计语言&#x…

clodeblocks debug断点调试_idea debug调试————简单常用,适合初学者

背景&#xff1a;在现在的开发中&#xff0c;如果不会debug&#xff0c;那么将会给我们的开发带来很大的困扰&#xff0c;如果仅仅是依靠日志信息去查问题&#xff0c;将会大大增加我们解决问题的难度&#xff0c;下面说一下idea开发工具下的简单debug。适用人群&#xff1a;ja…

bigdecimal判断等于0_vue2.0源码用到的工具函数,12个简易的复用函数,看看有多简单...

戎马&#xff1a;https://segmentfault.com/a/11900000196796381. 创建一个被冻结的空对象export const emptyObject Object.freeze({ }) 一旦创建不能给这个对象添加任何属性。2. 判断是否是 undefined 或 nullfunction isUndef (v) { return v undefined || v null}在源码…

告诉我们您想要什么,我们将做到:消费者驱动的合同测试消息传递

相当早以前&#xff0c;我们从REST&#xff08;ful&#xff09; Web API的角度讨论了消费者驱动的合同测试 &#xff0c;尤其是将其投射到Java&#xff08; JAX-RS 2.0规范&#xff09;的角度。 可以公平地说&#xff0c;至少在公共API方面&#xff0c; REST仍在Web API领域占据…

宝塔面板php降级,宝塔面板6.8.8降级到5.9.1的方案教程

有朋友问起&#xff0c;6.8版本用的不习惯&#xff0c;而且缺少5.9版本的nginx过滤器&#xff0c;而且6.8版本许多功能阉割的厉害&#xff1a;服务器状态中的 连接管理、进程管理 也都被阉割&#xff0c;5.9版本是可以在面板中查看服务器进程管理的&#xff0c;如图&#xff1a…

c++矩阵连乘的动态规划算法并输出_「Javascript算法设计」× 动态规划与回溯算法...

目录&#xff1a;分而治之算法动态规划回溯算法分而治之算法分而治之算法是算法设计的一种方式&#xff0c;它将一个问题分成多个和原问题相似的小问题&#xff0c;递归解决小问题&#xff0c;再将解决方式合并以解决原来的问题&#xff08;例如快速排序&#xff0c;二分搜索等…

背包问题九讲_背包问题

背包问题九讲我发现背包问题既棘手又有趣。 我敢肯定&#xff0c;如果您正在访问此页面&#xff0c;您已经知道了问题说明&#xff0c;但是只是为了完成本章&#xff1a; 问题&#xff1a; 给定一个最大容量为W和N的背包&#xff0c;每个背包都有自己的值和重量&#xff0c;将…

随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

一、什么是随机森林前面我们已经介绍了决策树的基本原理和使用。但是决策树有一个很大的缺陷&#xff1a;因为决策树会非常细致地划分样本&#xff0c;如果决策树分得太多细致&#xff0c;会导致其在训练集上出现过拟合&#xff0c;而如果决策树粗略地划分样本&#xff0c;又不…

http端口_PhpStorm 修改默认端口号63342

PhpStorm 修改默认端口号63342​blog.csdn.net关键词PhpStorm phpStorm phpstorm 修改默认端口号63342 8080 80步骤1.打开Settings2. Build, Execution, Deployment→Deployment3.点击添加&#xff0c;选择In place起一个名字&#xff08;可以随便起&#xff09;在Web server U…

rds mysql 磁盘空间,RDS MySQL 空间问题的原因和解决

other_size- 系统文件和临时文件使用空间data_size- 数据文件使用空间binlog_size- Binlog 文件占用空间注&#xff1a;获取实例诊断报告的步骤请参考如何访问RDS 实例诊断报告。2. 解决RDS 实例支持单独升级磁盘空间&#xff0c;升级磁盘空间是解决空间问题的有效方式之一。下…

微信小程序 全局变量异步函数_微信小程序【生命周期】

小程序分为应用、页面和组件三个部分&#xff0c;所以小程序的生命周期涉及以下应用的生命周期页面的生命周期组件的声明周期应用的生命周期对页面生命周期的影响应用的生命周期App() 函数用来注册一个小程序。接受一个 Object 参数&#xff0c;其指定小程序的生命周期回调等。…

Java / Spring:如何快速生成整个数据库CRUD REST API

随着时间的流逝&#xff0c;Spring框架已成为Java中使用最广泛的Web开发框架之一&#xff0c;这一点已变得显而易见。 在接下来的十年之际&#xff0c;Spring最受欢迎的模块Spring Boot刚刚进行了重大更新。 新的Spring Boot版本“ 2.2.0”和年份“ 2020”几乎完美匹配。 因此…

python界面长什么样图片_python界面是什么样的

安装完Python&#xff0c;在命令行输入“python”之后&#xff0c;如果成功&#xff0c;会得到类似于下面的窗口&#xff1a;可以看到&#xff0c;结尾有3个>符号&#xff08;>>>&#xff09;。>>>被叫做Python命令提示符&#xff08;prompt&#xff09;&…

python表格控件_python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例...

PyQt5表格控件QTableView简介 在通常情况下&#xff0c;一个应用需要和一批数据进行交互&#xff0c;然后以表格的形式输出这些信息&#xff0c;这时就需要用到QTableView类了&#xff0c;在QTableView中可以使用自定义的数据模型来显示内容&#xff0c;通过setModel来绑定数据…