【一天一大 lee】寻找两个正序数组的中位数 (难度:困难) - Day20201003
时间:2022-07-26
本文章向大家介绍【一天一大 lee】寻找两个正序数组的中位数 (难度:困难) - Day20201003,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
20201003
题目:[1]
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶: 你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
示例
- 示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
- 示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
- 示例 3:
输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
- 示例 4:
输入:nums1 = [], nums2 = [1]
输出:1.00000
- 示例 5:
输入:nums1 = [2], nums2 = []
输出:2.00000
提示:
- nums1.length == m
- nums2.length == n
- 0 <= m <= 1000
- 0 <= n <= 1000
- 1 <= m + n <= 2000
- <= nums1[i], nums2[i] <=
抛砖引玉
抛砖引玉
思路
先暴力合并排序求解:
- 先合并两个数字
- 对合并的数组排序
- 找到中位数:
- 合并数组长度为偶数:其中间两位和的平均值
- 长度为奇数:中间位的数
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
let arr = [...nums1, ...nums2],
len = arr.length,
index = Math.floor(len / 2)
if (len <= 1) return arr[0] || 0
arr.sort((a, b) => a - b)
if (len % 2) {
// 长度为奇数
return arr[index]
} else {
// 长度为偶数
return (arr[index] + arr[index - 1]) / 2
}
}
除了上面暴力的方法,还可以不用合并两个数组来处理本题
- 设两个数组分别为:len1、len2,总长为 len = len1 + len2
- 已知中位数前面有 (len+1)/2 个数,那么分别两个数组找到前 (len+1)/2 个数,就能得到想要的中位数
- 中位数的位置可能是在其中一个数组中或者两个数组各自取一个值求平均值
- 优先对较长的数组进行二分处理,另外一个数组补齐其他前位数
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
let len1 = nums1.length,
len2 = nums2.length
if (len1 > len2) return findMedianSortedArrays(nums2, nums1)
let len = len1 + len2
let start = 0,
end = len1
let partLen1, partLen2
while (start <= end) {
partLen1 = parseInt((start + end) / 2, 10)
partLen2 = parseInt((len + 1) / 2, 10) - partLen1
let L1 = partLen1 === 0 ? -Infinity : nums1[partLen1 - 1]
let L2 = partLen2 === 0 ? -Infinity : nums2[partLen2 - 1]
let R1 = partLen1 === len1 ? Infinity : nums1[partLen1]
let R2 = partLen2 === len2 ? Infinity : nums2[partLen2]
if (L1 > R2) {
end = partLen1 - 1
} else if (L2 > R1) {
start = partLen1 + 1
} else {
return len % 2
? Math.max(L1, L2)
: (Math.max(L1, L2) + Math.min(R1, R2)) / 2
}
}
}
参考资料
[1]
题目:: https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
[2]
公众号:前端小书童: http://qiniu.gaowenju.com/wechat-new.png
- linux (ubantu)安装最新版python3.6,以及直接安装anaconda
- 【java基础】匿名类
- 朴素贝叶斯法 2016年11月11日
- 11g中关于控制文件自动备份的改进(r6笔记第22天)
- Java基础(02)-15总结对象数组,集合Collection,集合List
- alert日志中的两种ORA错误分析(r6笔记第21天)
- 通过定制orabbix监控分析潜在的Oracle问题 (r6笔记第32天)
- 【C语言练手】C语言画太极图
- 关于奇怪的并行进程分析(一) (r6笔记第41天)
- 关于ora-02391问题的总结(r6笔记第40天)
- 一次数据库响应慢的问题诊断(r6笔记第39天)
- 贝叶斯分类器及Python实现
- R语言中文分词工具
- orabbix结合python发送图形报表(二) (r6笔记第38天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python持续监听文件变化代码实例
- laravel框架如何设置公共头和公共尾
- PHP结合Redis+MySQL实现冷热数据交换应用案例详解
- 浅谈Laravel模板实体转义带来的坑
- Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
- PHP大文件切割上传功能实例分析
- laravel Task Scheduling(任务调度)在windows下的使用详解
- PHP 7.4中使用预加载的方法详解
- PHP设计模式之工厂模式(Factory)入门与应用详解
- Laravel 实现Controller向blade前台模板赋值的四种方式小结
- Referer原理与图片防盗链实现方法详解
- Laravel 简单实现Ajax滚动加载示例
- PHP设计模式之解释器(Interpreter)模式入门与应用详解
- Laravel 实现在Blade模版中使用全局变量代替路径的例子
- PHP实现关键字搜索后描红功能示例