给定两个大小为 m 和 n 的有序数组 nums1
和 nums2
。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1
和 nums2
不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
方法一:时间复杂度0(m+n)不符合要求
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int i=0,j=0;
int[] a=new int[nums1.length+nums2.length];
int n=0;
while(i<nums1.length&&j<nums2.length){
if(nums1[i]<nums2[j]){
a[n++]=nums1[i++];
}else{
a[n++]=nums2[j++];
}
}
while(j<nums2.length){
a[n++]=nums2[j++];
}
while(i<nums1.length){
a[n++]=nums1[i++];
}
if(a.length%2==0){
return (double)(a[(a.length-1)/2] + a[(a.length-1)/2+1])/2;
}else{
return a[(a.length-1)/2];
}
}
}
方法一优化后:时间复杂度为略小于O(m+n)
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int a=nums1.length+nums2.length;
int m=0,n=0;
if(a%2==1){
m=a/2+1;
n=m;
}else{
m=a/2;
n=m+1;
}
if(nums1.length==0){
return (nums2[m-1]+nums2[n-1])/2.0;
}
if(nums2.length==0){
return (nums1[m-1]+nums1[n-1])/2.0;
}
int value=0,value1 = 0;
int len=0;
int i=0,j=0;
while(i<nums1.length&&j<nums2.length){
if(nums1[i]<nums2[j]){
len++;
value=nums1[i++];
if(len==m){
value1=value;
}
if(len==n){
return (value+value1)/2.0;
}
}else{
len++;
value=nums2[j++];
if(len==m){
value1=value;
}
if(len==n){
return (value+value1)/2.0;
}
}
}
while(j<nums2.length){
len++;
value=nums2[j++];
if(len==m){
value1=value;
}
if(len==n){
return (value+value1)/2.0;
}
}
while(i<nums1.length){
len++;
value=nums1[i++];
if(len==m){
value1=value;
}
if(len==n){
return (value+value1)/2.0;
}
}
return 1.0;
}
}