给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二分查找
class Solution {
int[] nums1;
int[] nums2;
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
this.nums1=nums1;
this.nums2=nums2;
int m=nums1.length;
int n=nums2.length;
return (getMid(0,0,(m+n+1)/2)+getMid(0,0,(m+n+2)/2))/2.0;
}
int getMid(int i,int j,int flg)
{
if(i>=nums1.length)return nums2[j+flg-1];
if(j>=nums2.length)return nums1[i+flg-1];
if(flg==1)return Math.min(nums1[i],nums2[j]);
if(i+flg/2>nums1.length)
{
return getMid(i,j+flg/2,flg-flg/2);
}else if(j+flg/2>nums2.length)
{
return getMid(i+flg/2,j,flg-flg/2);
}
else {
if(nums2[j+flg/2-1]<=nums1[i+flg/2-1])
{
return getMid(i,j+flg/2,flg-flg/2);
}
else
{
return getMid(i+flg/2,j,flg-flg/2);
}
}
}
}
暴力查找
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m=nums1.length;
int n=nums2.length;
int i=0;
int j=0;
int a=0;
int b=0;
int k=0;//用于记录已经遍历到第几个数
if(m==0)
return (nums2[((m+n+1))/2-1]+nums2[(m+n+2)/2-1] )/2.0;
if(n==0)
return (nums1[(m+n+1)/2-1]+nums1[(m+n+2)/2-1] )/2.0;
while(k!=((m+n+2)/2))
{
int min=0;
if(nums1[i]<=nums2[j])
{ min=nums1[i];
if(i==m-1)
nums1[i]=Integer.MAX_VALUE;//代表第一个数组已经遍历玩,并且中位数不在这
else i++;
}
else {min=nums2[j];
if(j==n-1)
nums2[j]=Integer.MAX_VALUE;//代表第一个数组已经遍历玩,并且中位数不在这
else j++; }
k++;
if(k==((m+n+1)/2))
a=min;
if(k==((m+n+2)/2))
b=min;
}
return (a+b)/2.0;
}
}
- 二分是用看别人思路写的,暴力是自己写的