6 js 比较两个数组的差异_每天一道算法题(js)(3)——寻找两个有序数组的中位数...
给定两个大小为 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)——寻找两个有序数组的中位数...相关推荐
- 截止目前为止,我遇到的最难的一道算法题:计算相邻两个数的最大差值
hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O( ...
- 牛客题霸 [在转动过的有序数组中寻找目标值] C++题解/答案
牛客题霸 [在转动过的有序数组中寻找目标值] C++题解/答案 题目描述 给出一个转动过的有序数组,你事先不知道该数组转动了多少 (例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2) ...
- python【力扣LeetCode算法题库】4- 寻找两个有序数组的中位数
寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...
- 判断给定的两个数是否是亲和数_动画演示LeetCode算法题:004-寻找两个有序数组的中位数...
题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...
- Leetcode题库 4.寻找两个正序数组的中位数(双指针法 C实现)
文章目录 解析 思路 代码 解析 Median_0指向合并数组中位数之左 Median_1指向合并数组中位数之右 例1:[1,3,4],[2,5] 合并为[1,2,3,4,5] Median_0=2( ...
- 2022-6-13 全O(1)的数据结构,两数相加,无重复字符的最长子串,寻找两个正序数组的中位数,盛最多水的容器,......
1. 全 O(1) 的数据结构 Design a data structure to store the strings' count with the ability to return the s ...
- java无序数组找最长连续子串,算法题整理
链表: 一个单链表,奇数位升序,偶数位降序,输出排序后的单链表.(写了个归并,拆成两个单链表并且把偶数位做头插翻转过来,再归并到一起.) 链表节点两两反转 奇偶链表 单向链表,头尾奇偶交替输出(中等) ...
- 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 ...
- 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II
代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...
最新文章
- 点击改变div高度_css实现div两列布局(两种方法)
- citrix lic申请流程
- RocketMQ:Consumer概述及启动流程与消息拉取源码分析
- SQL server经典电子书、工具和视频教程汇总
- iOS13后添加SceneDelegate初始化window
- 犀牛重建曲面_【教程】Rhino犀牛面包机建模教学(含模型领取)
- win8计算机丢失xinput1+3.dll,xinput1 3.dll丢失怎么办 win8下xinput1 3.dll丢失解决方法
- linux内核驱动中对字符串的操作【转】
- poj 2309 BST 使用树状数组的lowbit
- 一名7年总监的6点离职忠告
- JavaScript 隐性类型转换步骤浅析
- gulp-htmlmin 页面压缩插件 gulp插件 参数说明
- mongodb数据的导入导出备份恢复
- 如何用WPS表格生成拟合曲线
- Asp.net 万年历
- Nginx配置移动端和电脑端自动双向跳转(301重定向的实际场景,附带apache配置)
- 医学影像中的基础知识
- DELL安装不了mysql_dell电脑win10怎么安装mysql
- 10平米开家无人便利店
- Atlas的使用案例