题目
给定两个大小为m和n的有序数组nums1和nums2请找出这两个有序数组的中位数。要求算法的时间复杂度为O(log(m+n)。
提示:
- 例1:
- nums1 = [1,3]
- nums2 = [2]
- 中位数是 2.0
- 示例2:
- nums1 = [1,2]
- nums2 = [3,4]
- 中位数是(2+3)/2=2.5
JavaScript实现
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @param {number}
*/
var findMedianSortedArrays = function (nums1nums 2) {
let nums1Len nums1.length;
let nums2Len nums2.length;
let nums = [];
let i=0,j=0 k=0;
//对两个数组进行排序时,将它们逐个放入nums中
while(i < numslLen && j < nums2Len) {
if(nums1[i] < nums2[j] {
nums[k] = nums1[i]
i++;
}else{
nums[k] = nums2[j];
j++;
}
k++;
}
// 获取剩余的数量
while(i < nums1.length){
nums[k] = nums1[i];
i++;
k++;
}
while(< nums2.length){
nums[k] = nums2[j];
J++;
k++;
}
// 计算值
const halfLen = Math.ceil(nums length/2);
if(nums length % 2 === 0) {
return (nums[halfLen-1]+nums[halfLen])/2
}else{
return nums[halfLen-1];
}
};
Java实现
class Solution{
public double findMedianSortedArrays(int[] A,int[] B) {
int m = A.length;
int n = B.length;
if(m > n) { //确保 m<=n
int[] temp = A; A = B; B = temp;
int tmp = m; m = n; n = tmp;
}
int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
while ( iMin <= iMax) {
int i = (iMin + iMax) / 2;
int j = halfLen - i;
if (i < iMax && B[j-1] > A[i]){
iMin = iMin + 1; //i太小
}
else if(i > iMin && A[i-1] > B[j]) {
iMax = iMax - 1; //i太大
}
else{ //i是正确的
int maxLeft = 0;
if(i == 0) { maxLeft = B[j-1];}
else if(j == 0) { maxLeft = A[i-1];}
else{ maxLeft = Math.max(A[i-1],B[j-1]);}
if(( m + n ) % 2 == 1) {
return maxLeft;
}
int minRight = 0;
if(i == m) { minRight = B[j];}
else if(j == n) { minRight = A[i];}
else{ minRight = Math.min(B[j],A[i]);}
return(maxLeft + minRight) / 2.0;
}
}
return 0.0;
}
}