首页 > 代码库 > LeetCode 004 Median of Two Sorted Arrays - Java
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,比较这两个数的大小,在都找得到该项的情况下,有以下三种情况:
- a大于b,那么我们当前可以保证B的前k/2项都小于目标数,将该部分剔除生成B‘,问题转化为找A于B‘中第k/2大的数。
- a小于b,于上者类似,此时剔除A的前k/2项。
- 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 }
LeetCode 004 Median of Two Sorted Arrays - Java
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。