算法 2.4 归并排序 + 二分查找:寻找两个正序数组的中位数【leetcode 4】

 我来答
天罗网17
2022-07-17 · TA获得超过6191个赞
知道小有建树答主
回答量:306
采纳率:100%
帮助的人:73.3万
展开全部

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2
请你找出这两个正序数组的中位数

进阶:你能设计一个时间复杂度为 O(log(m + n)) 的算法解决此问题吗?

提示:
• 0 <= m、n <= 1000
• m+n >= 1
• -10 6 <= nums1[i] 、nums2[i] <= 10 6

  首先将数组拆分成两部分
  对这两部分分别递归排序
  元素个数大于1,继续拆分
  只有一个元素时无需排序,结束递归
  在对有序数组进行两两合并

时间复杂度: O(nlogn)
  • 需要递归的将数组切割 logn 次,然后进行两两归并,时间复杂度为 O(nlogn)

空间复杂度: O(n)
  • 递归深度是 O(logn)
  • 每次递归在合并时需额外辅助空间,长度与待排序的数组长度相等
  • 每次递归都会释放掉所占的辅助空间,最大辅助空间为 O(n)
  • 所以空间复杂度为 O(n+logn) = O(n)

使用折半的方式在有序数组中查找某一特定元素

每一次比较都使查找范围缩小一半


时间复杂度: O(m+n)
  • 需要多次比较两个数组中元素的大小
  • 只需要找到中间位置的元素,并不需要完成整个归并,总的比较次数为 (m+n)/2 + 1
  • 时间复杂度为 O(m+n)

空间复杂度: O(1)
  • 常数级的变量空间 O(1)

执行耗时:3 ms,击败了 69.10% 的Java用户
内存消耗:41 MB,击败了 24.82% 的Java用户

时间复杂度: O(log(min(m,n)))
  • 只需要对 nums1 和 nums2 中较短数组进行二分查找
  • 二分查找的时间复杂度为 O(log(min(m,n)))

空间复杂度: O(1)
  • 常数级内存空间 O(1)

执行耗时:2 ms,击败了 100.00% 的Java用户
内存消耗:40.9 MB,击败了 35.53% 的Java用户

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式