第 93 题:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2,请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log(m+n))。
示例 1:
nums1 = [1, 3] nums2 = [2]
中位数是 2.0
示例 2:
nums1 = [1, 2] nums2 = [3, 4]
中位数是(2 + 3) / 2 = 2.5
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(51)
代码不复杂,就是原本想能一行写完写成了这样,有点难读
或者不用递归
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/
120 ms
请教一下,这个的复杂度不是O(log(m+n))吧,应该是O(m+n)
https://www.youtube.com/watch?v=LPFhl65R7ww
推荐这个视频,图文并茂,生动形象,容易理解,时间复杂度O(log min(m, n))
大顶堆+小顶堆
太秀了,留下了没有技术的泪水,给我抄我都抄不会
function medianNum(arr1, arr2) {
let arr = [...arr1, ...arr2].sort((a,b) => a-b)
let len = arr.length
let index = parseInt(len/2)
let num = null
if (len%2 == 0) {
num = (arr[index] + arr[index - 1])/2
} else {
num = arr[index]
}console.log(num)
}
试了一下OK的
这个在leetCode上有, 不考虑时间负责度的情况下 把两个数组合并 -> 排序 -> 单数取中间,双数取中间两个平均值
力扣上一道题,不会做
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu-b/
二分法就是
随便写的, 求大神指点
sort 底层实现是什么啊
这是一个leetcode原题, 题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays .
官方中文版链接: https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
以下我的答案:
如果大家对算法有兴趣,可以关注下我的仓库《leetcode题解》
推荐:https://mp.weixin.qq.com/s/OE4lHO8-jOIxIfWO_1oNpQ
两个指针扫,排序,排到中位数 ,返回结果
题目已经说明了是两个有序数组,那可以按照归并排序的方法进行数组合并
我连中位数是啥都不知道 留下了没有技术的眼泪
对于一个有序数组来说,
function mid (arr1, arr2) {
const len1 = arr1.length;
const len2 = arr2.length;
}
大佬们 我这个能否达标?
leetcode上 144ms-208ms 之间 符合O(log(m+n))这个复杂度吗?
我的思路:
两个数组依次比较同时用n1、n2记住位置
当比较次数达到两个数组总长度一半时返回结果
先合并两个有序数组
然后求中位数,但是时间复杂度为O(m + n)
类似归并排序最后一大步的思路,不排序直接找中位数
逐步去除最大最小数,逼近中位数
思路:只要找到这两个有序数组的中位数,那么我们可以首先算出两个数组的长度和,然后推算出中位数所在的索引,如果长度为奇数,那么就是n/2,如果是偶数,那么是n/2 和n/2-1,我们对两个数组进行排序时(因为已经是有序数组,所以可以采用类似归并的算法,整合两个数组,循环结束条件即为数组长度=中位数的索引+1),然后最后得到中位数, 这样可以吗?
const nums1 = [1, 5, 5.5, 7, 8, 9]
const nums2 = [2, 3, 5, 6, 8.5, 10]
const len = Math.round((nums1.length + nums2.length) / 2)
const res = []
let i = 0, j = 0
while (res.length <= len + 1) {
// 合并两个有序数组
if (nums1[i] < nums2[j]) {
res.push(nums1[i])
i++
} else {
res.push(nums2[j])
j++
}
}
console.log(res)
if ((nums1.length + nums2.length) % 2) { //奇数位
console.log(res[len - 1])
} else { //偶数位
console.log((res[len] + res[len - 1]) / 2)
}
看下大O复杂度计算方法,哪来的O(log(m+n))
Runtime: 108 ms
大神是如何验证时间复杂度为 O(log(m+n)) ???
@Molunerfinn 老哥,厉害了!
思路是分治查找,利用类似TopK的思路,连续找两个指定的数,复杂度是O( log(m+n))
首先concat数组,然后判断数组长度是奇数偶数
奇数直接找第n/2位
偶数找n/2-1,n/2位 除2
@xiongchenf 兄弟,你用了sort之后时间复杂度已经是O(nlog(n))了,不符合题目O(log(m+n))
leetcode提交,算法耗时190ms
加了注释,好理解一点,时间复杂度O(log(n+m)):
想到一个 O(n) 的解法,类似归并排序,抛砖引玉