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

解题思路:

题目的难点在时间复杂度O(log(m + n))上,如果不要求时间复杂度,排序一下答案就出来了,

当然时间复杂度就变成了O((m+n)log(m + n))

var findMedianSortedArraysSlow = function (nums1, nums2) {var nums = nums1.concat(nums2)nums.sort((a, b) => {return a - b})let remain = nums.length % 2return remain ? nums[(nums.length - 1) / 2] : (nums[nums.length / 2] + nums[nums.length / 2 - 1]) / 2
};

如果需要达到题目的时间复杂度的话,看到log,第一个想法,肯定就是二分了

将两个数组不断二分,然后用他们的边界值做比较,这里麻烦的在于各种边界条件的限定,以及特殊情况的判断

LeetCode的答案里还有一个找到第K大的数的算法很是巧妙

下面这篇大神的讲解真的是很详细了,我也就不再多费口舌

力扣​leetcode-cn.com

下面附上javascript版本的二分法查找的解答,我补充了简单的注释

var findMedianSortedArrays = function(nums1, nums2) {// 让2数组的长度永远比1数组要长,保证奇数情况数组在nums2中if (nums1.length > nums2.length) [nums1, nums2] = [nums2, nums1];const length1 = nums1.length;const length2 = nums2.length;let min = 0;let max = length1;let half = Math.floor((length1 + length2 + 1) / 2);while (max >= min) {const i = Math.floor((max + min) / 2); //数组1的分界const j = half - i; //数组2的分界// 1数组被分开后的较小部分的最大值大于2数组被分开后较大部分的最小值if (i > min && nums1[i - 1] > nums2[j]) {max = i - 1; } else if (i < max && nums1[i] < nums2[j - 1]) {// 1数组被分开后的较大部分的最小值小于2数组被分开后较小部分的最大值min = i + 1;} else {let left,right;if (i === 0) left = nums2[j - 1]; //1数组所有的值都大于等于2数组较小部分的最大值,中位数左边界肯定在2数组内,且位置是 (length1+length2)/2 - length1也即是j-1,较小部分的最大值else if (j === 0) left = nums1[i - 1]; //2数组所有的值都大于等于1数组较小部分的最大值,中位数左边界肯定在1数组内,较大部分的最小值else left = Math.max(nums1[i - 1], nums2[j - 1]); //都不是的话,左边界是1数组和2数组的较小值里面的最大值if (i === length1) right = nums2[j]; //1数组的所有值都小于等于2数组较大部分的最小值,右边界在2数组较大值部分的最小值else if (j === length2) right = nums1[i]; //2数组的所有值都小于等于1数组较大部分的最小值,右边界在1数组叫大部分的最小值else right = Math.min(nums1[i], nums2[j]); //都不是的话,右边界是1数组和2数组的较小值里面的最小值return (length1 + length2) % 2 ? left : (left + right) / 2; //返回中位数}}return 0;
};

6 js 比较两个数组的差异_每天一道算法题(js)(3)——寻找两个有序数组的中位数...相关推荐

  1. 截止目前为止,我遇到的最难的一道算法题:计算相邻两个数的最大差值

    hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O( ...

  2. 牛客题霸 [在转动过的有序数组中寻找目标值] C++题解/答案

    牛客题霸 [在转动过的有序数组中寻找目标值] C++题解/答案 题目描述 给出一个转动过的有序数组,你事先不知道该数组转动了多少 (例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2) ...

  3. python【力扣LeetCode算法题库】4- 寻找两个有序数组的中位数

    寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...

  4. 判断给定的两个数是否是亲和数_动画演示LeetCode算法题:004-寻找两个有序数组的中位数...

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...

  5. Leetcode题库 4.寻找两个正序数组的中位数(双指针法 C实现)

    文章目录 解析 思路 代码 解析 Median_0指向合并数组中位数之左 Median_1指向合并数组中位数之右 例1:[1,3,4],[2,5] 合并为[1,2,3,4,5] Median_0=2( ...

  6. 2022-6-13 全O(1)的数据结构,两数相加,无重复字符的最长子串,寻找两个正序数组的中位数,盛最多水的容器,......

    1. 全 O(1) 的数据结构 Design a data structure to store the strings' count with the ability to return the s ...

  7. java无序数组找最长连续子串,算法题整理

    链表: 一个单链表,奇数位升序,偶数位降序,输出排序后的单链表.(写了个归并,拆成两个单链表并且把偶数位做头插翻转过来,再归并到一起.) 链表节点两两反转 奇偶链表 单向链表,头尾奇偶交替输出(中等) ...

  8. C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  9. 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...

最新文章

  1. 点击改变div高度_css实现div两列布局(两种方法)
  2. citrix lic申请流程
  3. RocketMQ:Consumer概述及启动流程与消息拉取源码分析
  4. SQL server经典电子书、工具和视频教程汇总
  5. iOS13后添加SceneDelegate初始化window
  6. 犀牛重建曲面_【教程】Rhino犀牛面包机建模教学(含模型领取)
  7. win8计算机丢失xinput1+3.dll,xinput1 3.dll丢失怎么办 win8下xinput1 3.dll丢失解决方法
  8. linux内核驱动中对字符串的操作【转】
  9. poj 2309 BST 使用树状数组的lowbit
  10. 一名7年总监的6点离职忠告
  11. JavaScript 隐性类型转换步骤浅析
  12. gulp-htmlmin 页面压缩插件 gulp插件 参数说明
  13. mongodb数据的导入导出备份恢复
  14. 如何用WPS表格生成拟合曲线
  15. Asp.net 万年历
  16. Nginx配置移动端和电脑端自动双向跳转(301重定向的实际场景,附带apache配置)
  17. 医学影像中的基础知识
  18. DELL安装不了mysql_dell电脑win10怎么安装mysql
  19. 10平米开家无人便利店
  20. Atlas的使用案例

热门文章

  1. 从本地上传到hdfs上出现异常
  2. 解决eclipse Run启动或Debug时Console控制台不自动弹出问题
  3. CSS——清除浮动的六种解决方案
  4. Virtual Box 工具栏(菜单栏)消失的解决方法
  5. input中v-model和value不能同时调用时解决方案
  6. localStorage和cookie的跨域解决方案
  7. C/C++ sizeof函数解析——解决sizeof求结构体大小的问题
  8. vue中解决时间在ios上显示NAN的问题
  9. 如何在Java中比较日期? [重复]
  10. 将.gitignore应用于已提交的文件