题目:
给定两个大小为 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
思路:
题目中限制了算法的时间复杂度为O(log(m + n)),就要求我们在最多在一次遍历中将两个数组联合排序
由于是两个有序数组,直接从前面开始比较就可以。
定义sorted为排序后的数组,分别使用 i, j标记num1,num2当前比较的数字索引,将较小的数字填入sorted,知道其中一个数组全部并入到sorted中,然后将剩余的数组拼接在sorted后面,最后只要取中位数就可以了。
代码如下:
var findMedianSortedArrays = function(nums1, nums2) {
let sorted = [], len1 = nums1.length, len2 = nums2.length;
if(len1 === 0 || len2 === 0){
sorted = nums1.concat(nums2)
}else{
let i = 0, j = 0;
while(i<len1 && j<len2){
if(nums1[i] <= nums2[j]){
sorted.push(nums1[i]);
i++;
}else{
sorted.push(nums2[j]);
j++
}
}
if(i === len1){
sorted = sorted.concat(nums2.slice(j))
}
if(j === len2){
sorted = sorted.concat(nums1.slice(i))
}
}
return (len1+len2)%2==0?(sorted[(len1+len2)/2]+sorted[(len1+len2)/2-1])/2:sorted[Math.ceil((len1+len2)/2)-1];
};
代码地址:github地址