本文题目来源力扣题库
力扣地址
给定两个大小分别为 m 和 n 的正序(从小到大)数组nums1 和nums2。请你找出并返回这两个正序数组的 中位数 。
/**
* 给定两个大小分别为 m 和 n 的正序(从小到大)数组nums1 和nums2。请你找出并返回这两个正序数组的 中位数 。
*
* 算法的时间复杂度应该为 O(log (m+n)) 。
*
* @param args
*/
public static void main(String[] args) {
int[] num1 = new int[]{2,4,7};
int[] num2 = new int[]{1,3,5,6};
System.out.println(findMedianSortedArrays(num1,num2));
}
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] temp = new int[nums1.length+nums2.length];
int tempIndex = 0;
int l1 = nums1.length;
int l2 = nums2.length;
int[] temp1;
int[] temp2;
// 设置始终让最长的数组为 temp1
if(l1 > l2){
temp1 = nums1;
l1 = nums1.length;
temp2 = nums2;
l2 = nums2.length;
}else {
temp1 = nums2;
l1 = nums2.length;
temp2 = nums1;
l2 = nums1.length;
}
// 初始化移动指针
int t1 = 0,t2 = 0;
while(t1 < l1 || t2 < l2){
// temp1 数据全部取出只取 temp2
if(t1 == l1){
int k = temp2[t2];
temp[tempIndex++] = k;
t2++;
continue;
}
// temp2 数据全部取出只取 temp1
if(t2 == l2){
int j = temp1[t1];
temp[tempIndex++] = j;
t1++;
continue;
}
// temp1 和 temp2 全部有数据则一起取出做对比
int j = temp1[t1];
int k = temp2[t2];
if(j < k){
temp[tempIndex++] = j;
t1++;
} else if (j > k) {
temp[tempIndex++] = k;
t2++;
}else{
temp[tempIndex++] = j;
temp[tempIndex++] = k;
t1++;;t2++;
}
}
double res = 0;
if(tempIndex % 2 == 0){
res = (temp[tempIndex/2-1]+temp[tempIndex/2])/2D;
}else {
res = temp[tempIndex/2];
}
return res;
}