Leetcode: Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

You may assume nums1 and nums2 cannot be both empty.

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

   看到已序数组,可能最直接的想法就是合并两个有序数组,然后求中位数,使用归并排序合并的方式时间复杂度O(n+m),题目要求算法时间复杂度为O(log(m+n))。由于数组已序,可以考虑使用二分的方式来解决,每次缩小一半数据规模,时间复杂度为O(log(n+m)),满足要求,OK,该怎么做呢?

  设两个数组A,B,长度分别为len1,len2 可以将问题看作二分查找第k数的问题,由于是两个数组,因此按照两个数组长度所占比例把第k(下标)数分割,每次查找A数组的A[p]和B[q]两个数进行比较大小,其中p=max(1,len1/(len1+len2)*k),q=k-p,取max保证p至少为1,向前搜索一个。A[p],B[q]两者的关系有三种情况:

(1)A[p] > B[q],此时可以知道第k数一定在A{left1,left1+p},B{left2+q,right2},丢掉一半数据

(2)A[p] < B[q],此时可以知道第k数一定在A{left1+p,right1},B{left2,left2+q},丢掉一半数据

(3)A[p]==B[q],返回其中一个即可

定义函数查找第k数: findKth(A,B,l1,r1,l2,r2,k)

为了保证第一个数组长度一定小于第二个数组长度

递归边界

所以完整的第k数的算法是

题目要求求两个数组的中位数,因此可能存在两种情况,两个数组长度之和为奇数或者偶数

奇数:k = (len1+len2)/2+1 。

偶数:需要查找两个数,然后求平均 k1=(len1+len2)/2, k2 = k1+1。

所以此题完整的代码是:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值