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
解题思路
为使读者更好理解,采用举例讲解
例如nums1=[1,2,5],nums2=[2,3,4,6]
step1:先用nums2中的2和nums1的元素进行比较,遇到比2大的元素时,将2插入;
step2:将2在nums2中删除;
step3:再将nums2中的3从刚插入位置开始比较,遇到比3大的元素插入;
step4:将3在nums2中删除;
始终重复这个过程(nums1为空或nums2为空时结束循环)
如果nums2中有剩余元素,放在nums1最后即可;
说明:nums2每次插入后删除即省略了一个大循环,降低了时间复杂度;
希望能给读者带来一些启发,谢谢!
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
for(var j=0;j<nums1.length;j++){
// 1 2 3 4 4 1 2333
if(nums1[j] > nums2[0]){
nums1.splice(j,0,nums2[0]); //将nums2 中的元素插入nums1;
nums2.shift(); //将刚插入元素删除;
}
if(nums2.length==0){
break; //当nums2中没有元素时跳出循环,以免浪费时间;
}
}
if(j==nums1.length){
nums1=nums1.concat(nums2); // 将排序剩下的连接
}
if(nums1.length%2==0){
return (nums1[parseInt((nums1.length-1)/2)]+nums1[parseInt((nums1.length-1)/2) +1])/2;
}
else{
return nums1[(nums1.length-1)/2];
}
};