解题思路:
时间复杂度要求O(log(m+n)),要从m+n开始二分,中位数为第(m+n+1)/2加上第(m+n+2)/2的平均数,分别计算这两个数。假设现在求第k大的数,在nums1和nums2分别取k/2个数来比较,不够则取全部,小的一端排除,所以k减去k/2,之后被排除一部分的数组左端点更新,继续取k/2个数即可。
class Solution { int m,n; double getk(int k,int[] nums1, int[] nums2,int l1,int r1,int l2,int r2){ //为空直接返回 if(l1==m){ return nums2[l2+k-1]; } if(l2==n){ return nums1[l1+k-1]; } //递归出口 if(k==1){ return Math.min(nums1[l1],nums2[l2]); } //每个数组取k/2个数后比较的位置 int mid1=Math.min(r1,l1+k/2-1); int mid2=Math.min(r2,l2+k/2-1); //排除k/2个数 if(nums1[mid1]<nums2[mid2]){ return getk(k-(mid1-l1+1),nums1,nums2,mid1+1,r1,l2,r2); } else{ return getk(k-(mid2-l2+1),nums1,nums2,l1,r1,mid2+1,r2); } } public double findMedianSortedArrays(int[] nums1, int[] nums2) { m=nums1.length; n=nums2.length; int len=m+n; //统一处理奇数偶数 return (getk((len+1)/2,nums1,nums2,0,m-1,0,n-1)+getk((len+2)/2,nums1,nums2,0,m-1,0,n-1))/2; } }
4. 寻找两个正序数组的中位数
最新推荐文章于 2024-11-11 20:46:27 发布