来源于力扣 4
题目要求: 给定两个大小为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
思路: 我的思想是把两个数组合并为一个数组,然后分别进行情况划分,具体见代码实现,特别提醒的是把数组为空的情况必须考虑上,不然 力扣 提交不成功。
java代码:
package 面试金典;
import java.util.Arrays;
public class test007 {
public static void main(String[] args) {
int[] nums1= {};
int[] nums2= {0,1};
double mid=fidMedianSortedArrays(nums1,nums2);
System.out.println(mid);
}
private static double fidMedianSortedArrays(int[] nums1, int[] nums2) {
int m=nums1.length;
int n=nums2.length;
int k=0;
int[] arr=new int[m+n];
while(m!=0&&n!=0) {
for(int i=0;i<m;i++) {
arr[k++]=nums1[i];
}
for(int i=0;i<n;i++) {
arr[k++]=nums2[i];
}
Arrays.sort(arr);
if(arr.length>1) {
if(arr.length%2==0) {
return (arr[arr.length/2]+arr[arr.length/2-1])/2.0;
}else {
return arr[arr.length/2];
}
}
return arr[0];
}
while(m==0&&n!=0) {
if(n>1) {
if(n%2==0) {
return (nums2[nums2.length/2]+nums2[nums2.length/2-1])/2.0;
}else {
return nums2[nums2.length/2];
}
}
return nums2[0];
}
while(m!=0&&n==0) {
if(m>1) {
if(m%2==0) {
return (nums1[nums1.length/2]+nums1[nums1.length/2-1])/2.0;
}else {
return nums1[nums1.length/2];
}
}
return nums1[0];
}
return 0;
}
}