leetcode第四题中位数详解(一题学二分法)

原始题目

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.

意思是给定了两个已经排序的数组大小分别为m和n,在O(log(m+n))的时间复杂度下,找到他们的中位数。

你可以假设两个数组不同时为空。

当看到这个题目的时候,我相信很多人的想法和我一样,是合并两个数组,排序,找到其中位数。几乎没有任何犹豫,不过后来一提交,超时!
这种最最简单的方法的时间复杂度为O(nlogn);显然大于了题目的要求。于是我想到了二分法,大家都知道二分法的时间复杂度是O(logn)。

首先我们要明白中位数的真正意义是将一个数组分为左右相等的两个部分,假设一个数组有n个数字,那么中+位数就是其第(n+1)/2小数字。即:【1,2,3,4,5,6,7】 n=7, median=(7+1)/ 2=4;

           left_A            |        right_A
    A[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]

那么在两个数组中,

      left_part          |        right_part
A[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]
B[0], B[1], ..., B[j-1]  |  B[j], B[j+1], ..., B[n-1]

※真正的中位数会在两个数组分别的中位数附近!所以我们先分别求出两个数组的中位数i和j(其实j是根据i出来的),然后比较A [ i - 1 ] < = B [ j ] and B [ j - 1 ] < = A [ i ],通过控制 i 来寻找,left_part多了 i- -,left_part少了,就i++,
※那么,我们要做的事情就是!!!找到一个满足条件的 i !!!!满足 A [ i - 1 ] < = B [ j ] and B [ j - 1 ] < = A [ i ] ,那么说明这两个数组已经被均分了即left_part元素个数=right_part元素个数,即中位数就是*MAX ( A[ i - 1 ] , B [ j - 1 ] )

直接上代码!

	public static double soluiton(int[] A , int[] B) {
   
		int m=A.length;
		int n=B.length;
		
		if(m>n) {
   //ensure m<=
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值