一、归并排序方法实现
//时间复杂度O(m+n), 空间复杂度O(m+n)
var findMedianSortedArrays = function(nums1, nums2) {
let nums = [], m = nums1.length, n = nums2.length;
if(m === 0) { //nums1为空数组
if(n % 2 === 0) { //nums2的长度为偶数
return (nums2[n/2 - 1] + nums2[n/2])/2;
} else {
return nums2[Math.floor(n/2)];
}
}
if(n === 0) { //nums2为空数组
if(m % 2 === 0) { //nums1的长度为偶数
return (nums1[m/2 - 1] + nums1[m/2])/2;
} else {
return nums1[Math.floor(m/2)];
}
}
let count = 0, i = 0, j = 0; //count代表合并后的数组的长度, i, j分别代表遍历nums1, nums2的索引
while(count !== (m + n)) {
if(i === m) { //nums1已经遍历完成
while(j !== n) {
nums[count++] = nums2[j++];
}
break;
}
if(j === n) { //nums2已经遍历完
while(i !== m) {
nums[count++] = nums1[i++];
}
break;
}
//这样可以保证合并后的数组是有序的
if(nums1[i] < nums2[j]) {
nums[count++] = nums1[i++];
} else {
nums[count++] = nums2[j++];
}
}
if(count % 2 === 0) { //合并后的数组的元素个数是偶数
return (nums[count/2 - 1] + nums[count/2])/2;
} else {
return nums[Math.floor(count/2)];
}
};
console.log(findMedianSortedArrays([0, 1, 2, 2, 3], [3, 4, 5]));
二、数组连接后排序实现
//时间复杂度O(m+n), 空间复杂度O(m+n)
var findMedianSortedArrays = function(nums1, nums2) {
let length1 = nums1.length;
let length2 = nums2.length;
let middle = (length1 + length2 - 1)/2;
var nums = nums1.concat(nums2).sort();
if(Math.floor(middle) === middle) { //如果middle是一个整数
return nums[middle];
} else { //如果middle不是一个整数
return (nums[Math.floor(middle)] + nums[Math.ceil(middle)])/2;
}
};
console.log(findMedianSortedArrays([0, 1, 2, 2, 3], [3, 4, 5]));
三、双指针法实现
//时间复杂度O(m+n), 空间复杂度O(1)
/**
* 双指针法:如果两个数组的和为偶数的话,则需遍历len/2 + 1次, 如果为奇数,则需遍历Math.floor(len/2) + 1次,
* 使用prev和current来分别记录上一轮循环和该轮循环的值
* @param {Array} nums1
* @param {Array} nums2
*/
var findMedianSortedArrays = function(nums1, nums2) {
let m = nums1.length, n = nums2.length, len = m + n;
let prev = -1, current = -1, aStart = 0, bStart = 0; //prev保存上一轮循环的结果,current保存当前循环的结果,aStart表示nums1的指针,bStart表示nums2的指针
for(let i = 0; i <= len/2; i++) {
prev = current; //prev指向上一轮循环的值
//nums1指针向后移的条件: aStart < m 且 nums1[aStart] < nums2[bStart],但是第二个条件的前提条件是nums2的指针不能越界
if(aStart < m && (bStart >= n || nums1[aStart] < nums2[bStart])) {
current = nums1[aStart++];
} else {
current = nums2[bStart++];
}
}
if(len % 2 === 0) {
return (prev + current)/2;
} else {
return current;
}
};
console.log(findMedianSortedArrays([0, 1, 2, 3], [3, 4, 5]));
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。