【LeetCode笔记】4. 寻找两个正序数组的中位数(Java、二分、递归)

文章目录

  • 题目描述
  • 思路 & 代码

题目描述

  • 算是拖了好久的题目= =,一开始刷的时候没打算直接冲困难
  • 不过面试常客了,还是得冲掉,而且不能留下心魔嘛!
  • 难点在于实现时间复杂度 O(log(m + n)),显而易见得用二分法
    在这里插入图片描述
    在这里插入图片描述

思路 & 代码

  • 长度奇偶情况处理:因为偶数要取平均值,所以这边进行了两次函数调用,分别取较小、较大的中位数再取平均(奇数就相当于跑重复了一次)
  • 主要思路:基于二分法的基础上进行排除法
  • 两数组元素都够的情况,每次舍去 k / 2 个数
  • 一方不够的情况,直接指向数组尾,看对比情况舍
  • 保证空数组一定是 nums1[ ]
  • 证明 & 更多见代码注释
  • 注意:k 并非下标
class Solution {/*** 正确性证明:每次去掉的值都是应当去掉的* 因为:答案一定不在数组n去掉范围中,极端情况下也是在数组m范围的尾部* 核心:排除法,不断去掉可去值,并维护k(中位数为第k小数)* ps:其实有效代码只有 20 行= =*/public double findMedianSortedArrays(int[] nums1, int[] nums2) {int n = nums1.length;int m = nums2.length;// +1 +2:k 不是下标,比如 k = 1,指第一个,也就是 index + k - 1// left & right 是为了奇偶// 奇数情况 left == right// 偶数情况 left == right - 1int left = (n + m + 1) / 2;int right = (n + m + 2) / 2;// 奇数情况:两次一样的过程// 偶数情况:中间俩个值的平均值return (getKth(nums1, 0, n - 1, nums2, 0, m - 1, left)+ getKth(nums1, 0, n - 1, nums2, 0, m - 1, right)) / 2.0;}int getKth(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k){int len1 = end1 - start1 + 1;int len2 = end2 - start2 + 1;// 保证空数组一定是 nums1[]if(len1 > len2){return getKth(nums2, start2, end2, nums1, start1, end1, k);}// 出现空数组,直接化成求一数组第k小数的情况if(len1 == 0){return nums2[start2 + k - 1];}// 找到最后的情况,直接返回两数组当前最小值if(k == 1){return Math.min(nums1[start1], nums2[start2]);}// 指向第k/2小的位置 or 指向尾部int i = start1 + Math.min(len1, k / 2) - 1;int j = start2 + Math.min(len2, k / 2) - 1;// 舍去值的数量不一定相等(指向尾部情况)// 舍nums2的情况if(nums1[i] > nums2[j]){return getKth(nums1, start1, end1, nums2, j + 1, end2, k - (j - start2 + 1));}// 舍nums1的情况else{return getKth(nums1, i + 1, end1, nums2, start2, end2, k - (i - start1 + 1));}}}
  • 无注释版
class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int mid1 = (nums1.length + nums2.length + 1) / 2;int mid2 = (nums1.length + nums2.length + 2) / 2;return (getMid(nums1, 0, nums1.length - 1, nums2, 0, nums2.length - 1, mid1) + getMid(nums1, 0, nums1.length - 1, nums2, 0, nums2.length - 1, mid2)) / 2.0;}public int getMid(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k) {int len1 = end1 - start1 + 1;int len2 = end2 - start2 + 1;if(len2 < len1) {return getMid(nums2, start2, end2, nums1, start1, end1, k);}if(len1 == 0) {return nums2[start2 + k - 1];}if(k == 1) {return Math.min(nums1[start1], nums2[start2]);}int index1 = start1 + Math.min(len1, k / 2) - 1;int index2 = start2 + Math.min(len2, k / 2) - 1;if(nums1[index1] < nums2[index2]) {return getMid(nums1, index1 + 1, end1, nums2, start2, end2, k - (index1 - start1 + 1));}else {return getMid(nums1, start1, end1, nums2, index2 + 1, end2, k - (index2 - start2 + 1));}}
}

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

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

相关文章

梦幻西游服务器每周几维护,梦幻西游5月6日维护公告:唯美版地图不再更新

为保证服务器的运行稳定和服务质量&#xff0c;《梦幻西游2》所有服务器将于2014年5月6日上午8:00停机&#xff0c;进行每周例行的维护工作。预计维护时间为上午8:00&#xff5e;9:30。如果在预定时间内无法完成维护内容&#xff0c;开机时间也将继续顺延。请各位玩家相互转告&…

浏览器市场占有率_全球市场占有率第一的谷歌浏览器添加对ipfs://的支持!

欢迎来到IPFS周报&#xff01;&#x1f44b;星际文件系统(IPFS)是一种新的超媒体分布式协议&#xff0c;基于内容和身份的寻址。IPFS支持创建完全分布式应用程序。它旨在使网络更快&#xff0c;更安全&#xff0c;更开放。由于这是一个非常大的项目&#xff0c;我们在每期周报中…

win10 系统地图无法定位服务器,图文修复win10系统无法打开定位服务的详细技巧...

有很多网友在使用电脑的过程总难免会遇到win10系统无法打开定位服务的情况。尽管处理方法特别的容易&#xff0c;可是也有很多朋友不知道win10系统无法打开定位服务究竟要怎么处理。我就给大家整理总结了win10系统无法打开定位服务的解决方法&#xff0c;解决起来也不难&#x…

【LeetCode笔记】41. 缺失的第一个正数(Java、哈希)

文章目录题目描述思路 & 代码题目描述 难点在于时空复杂度的要求想出最优方法&#xff0c;需要认真理解题目。 思路 & 代码 做法&#xff1a;建立一个逻辑上的哈希表&#xff0c;令 nums[i] i 1&#xff0c;比如 nums[0] 1。那么第一个不符合这个要求的元素的下…

笔记本电脑如何保养_电脑保养只是吹一吹?别再被骗了,电脑没做这些就等于没保养...

汽车大约跑5000KM就需要保养一次&#xff0c;电脑与汽车一样&#xff0c;在使用一定时间的时候也需要保养一次&#xff0c;电脑保养对于很多朋友来说还是很陌生的&#xff0c;在这里小编就给大家做一个简单的科普&#xff0c;电脑保养主要指的是清理灰尘与更换硅脂&#xff0c;…

【LeetCode笔记】199. 二叉树的右视图(Java、二叉树、层序遍历)

文章目录题目描述思路 & 代码题目描述 挺简单的&#xff0c;直接看思路代码吧。 思路 & 代码 就是一个层序遍历&#xff0c;取每层的最右边结点即可 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…

ibm笔记本电脑电池_笔记本电池怎么充电 笔记本电脑电池充电方法【详解】

笔记本电脑以其精致小巧的外形、方便携带的特点&#xff0c;受到了众多人士的喜爱。在 办公室 没有完成的工作&#xff0c;可以随时带到家中去完成&#xff0c;它的存在就是为了我们能有便捷的办公模式。那么对于这个日夜陪伴我们的好物件大家都是怎么充电的呢&#xff1f;方法…

电脑键盘下划线怎么打_图文详解笔记本电脑键盘失灵怎么办

相信有很多朋友都遇到过笔记本键盘失灵的情况&#xff0c;其实笔记本键盘失灵的问题是可大可小的&#xff0c;下面小编就给大家详细介绍关于怎么解决笔记本电脑失灵的操作方法&#xff0c;让大家在遇到问题时自己就能够解决这些问题。方法一。1。右键单击桌面右下角的输入方法&…

【LeetCode笔记】69. x 的平方根(Java、二分)

文章目录题目描述思路 & 代码更新版题目描述 本质&#xff1a;找满足 k * k < x 的最大 k 思路 & 代码 二分&#xff0c;对满足 k * k < x 的最大 k进行查找。注意极端数据&#xff0c;用 long暴力法先来一个 class Solution {public int mySqrt(int x) {in…

opencv 模板匹配_详细剖析模板匹配

点击上方“新机器视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达模板匹配介绍我们需要2幅图像&#xff1a;原图像 (I): 在这幅图像里,我们希望找到一块和模板匹配的区域模板 (T): 将和原图像比照的图像块模板匹配就是在整个图像区域发现…

【LeetCode笔记】143. 重排链表(Java、链表、栈、快慢指针)

文章目录题目描述思路 & 代码更新版&#xff1a;快慢指针 翻转链表题目描述 一看题目反序&#xff1a;用栈更新&#xff1a;O(1) 空间复杂度 思路 & 代码 先快慢指针&#xff0c;找到需要入栈的起点&#xff0c;然后逐个入栈然后逐个出栈&#xff0c;进行重排即可…

hdfs中与file数组类似的数组_如何在 JavaScript 中克隆数组

作者&#xff1a;Yazeed Bzadough译者&#xff1a;allenJavaScript 有很多方法可以做任何事情&#xff0c;现在我们研究数组。1.扩展运算符(浅拷贝)自从 ES6 发布以来&#xff0c;这一直是最受欢迎的方法。这是一个简短的语法&#xff0c;你会发现它在使用像 React 和 Redux 这…

【LeetCode笔记】54. 螺旋矩阵(Java、迭代、递归)

文章目录题目描述思路 & 代码递归迭代更新版 - 递归题目描述 递归和迭代都实现了&#xff0c;递归相对比较好理解&#xff0c;也比较好实现 思路 & 代码 递归 每次都把最外圈的元素跑完一行 or 一列的时候&#xff0c;跑一次结束边界&#xff1a;left > right …

ubuntu boot空间不足_安装 Ubuntu 双系统

在很久以前就想试一试Linux了&#xff0c;一直没有实践。一是觉得太麻烦&#xff0c;二是怕把电脑弄坏。后来实践了一次后发现&#xff0c;其实并没有想象中那么难&#xff0c;这是一个完全独立的系统&#xff0c;与隔壁的Windows半毛钱关系都没有。把引导搞定就不怕了。另外&a…

【LeetCode笔记】112 113. 路径总和 I II(Java、递归、DFS)

文章目录路径总和 I路径总和 II比较简单&#xff0c;就连着一起写了 路径总和 I 注意&#xff1a;一定得走到叶子才算 直接看代码吧&#xff0c;注释也就几行。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…

安装python环境与运行_linux下怎么安装python的运行环境

展开全部 1、2113linux下安装python3 a、 准备编译环境(环境如果不对的5261话&#xff0c;可能遇到各种问题&#xff0c;比如wget无法下4102载1653https链接的文件)1 2 yum groupinstall Development Tools yum install zlib-devel bzip2-devel openssl-devel ncurses-devel2 下…

【LeetCode笔记】437. 路径总和III(Java、双重递归、二叉树)

文章目录题目描述思路 & 代码题目描述 说实话确实比I & II要恶心一点这里直接用双递归秒了&#xff08;今天才发现我是之前先写的III&#xff0c;再写的I & II&#xff09;有前缀和的写法&#xff0c;但是懒得整了 思路 & 代码 和之前不同&#xff0c;这里…

python中break和continue的区别_python中break和continue的区别

原博文 2017-08-01 09:56 − break和continue 1.break 意思为结束循环 例&#xff1a; i 0 while i<10: i1 if i5: #当i5时&#xff0c;结束整个循环 ...030778 相关推荐 2019-12-20 11:37 − 1、break break的使用场景&#xff1a;循环语句和switch-case分支语句。 它的作…

【LeetCode笔记】128. 最长连续序列(Java、哈希表、动态规划)

文章目录题目描述思路 & 代码变式题&#xff1a;返回答案数组更新可恶。。居然碰到了周一面试没撕出最优复杂度的题 题目描述 难点在于时间复杂度O(n)&#xff0c;否则来个sort()还是很轻松的 思路 & 代码 一般来说&#xff0c;时间复杂度可以用空间复杂度来弥补&a…

【LeetCode笔记】148. 排序链表(Java、归并排序、快慢指针、双重递归)

文章目录题目描述思路 & 代码二刷题目描述 难点在于时空复杂度的要求 思路 & 代码 转化成&#xff1a;归并排序 合并两个有序链表 即可利用快慢指针来拆分成两条链表注意&#xff1a;链表的拆分 & 连接时间复杂度O(n * logn)&#xff0c;空间复杂度 O(1) /**…