LeetCode 004 Median of Two Sorted Arrays - Java

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)).

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(m+n)的时间复杂度,但题目中提出要使用O(long(m+n))的时间复杂度,难度由此而来,可以想到的是使用二分的思路。

同时,对于题目中我们要寻找中位数的问题我们优化为寻找两个数组中第k大的数。我们当前的处理先为将数组A[m]与B[n]传入,并保持m>n,我们对于当前A找到第k/2项为a,B也一样为b,比较这两个数的大小,在都找得到该项的情况下,有以下三种情况:

    1. a大于b,那么我们当前可以保证B的前k/2项都小于目标数,将该部分剔除生成B',问题转化为找A于B'中第k/2大的数。
    2. a小于b,于上者类似,此时剔除A的前k/2项。
    3. a等于b,此时a与b的值就是目标数值。

上述情况可以进行递归,3为一种中止条件。

但是还存在一些问题,假如A没有第k/2项,直接取到第m项,B就取k-m项。
如果此时A为空,直接返回B的第k项,如果k为1,比较A与B首项返回较小值。

 

Java实现:

 1 import java.util.Arrays;
 2 
 3 public class Solution {
 4     public double findMedianSortedArrays(int[] nums1, int[] nums2) {
 5         int len1=nums1.length;
 6         int len2=nums2.length;
 7         int total=len1+len2;
 8         if(total%2==1) return findKth(nums1,len1,nums2,len2,total/2+1);
 9         else return (findKth(nums1,len1,nums2,len2,total/2)+findKth(nums1,len1,nums2,len2,total/2+1))/2;
10     }
11     private double findKth(int[] nums1,int len1,int[] nums2,int len2,int k){
12         if(len1>len2) return findKth(nums2,len2,nums1,len1,k);
13         if(len1==0) return (double)nums2[k-1];
14         if(k==1) return Math.min(nums1[0],nums2[0]);
15         int now1=Math.min(k/2,len1);
16         int now2=k-now1;
17         if(nums1[now1-1]<nums2[now2-1]) return findKth(Arrays.copyOfRange(nums1,now1,len1),len1-now1,Arrays.copyOfRange(nums2,0,now2),now2,k-now1);
18         else if(nums1[now1-1]>nums2[now2-1]) return findKth(Arrays.copyOfRange(nums1,0,now1),now1,Arrays.copyOfRange(nums2,now2,len2),len2-now2,k-now2);
19         else return (double)nums1[now1-1];
20     }
21 }

 

转载于:https://www.cnblogs.com/zaritiy/p/6938849.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值