寻找两个正序数组的中位数
题目要求:
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入: nums1 = [1,3], nums2 = [2]
输出: 2.00000
解释: 合并数组 = [1,2,3] ,中位数 2
示例 2:
输入: nums1 = [1,2], nums2 = [3,4]
输出: 2.50000
解释: 合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
算法思路:
我的算法思路是一个典型的以空间换时间的写法思路,不是最优解。
创建一个新的数组3,暂存新数组。遍历数组1的同时,遍历数组2,循环判断当数组1的值大于数组2的值,就保存数组2的值,反之保存数组1的值。
因为可能存在数组2的值没有被遍历完的可能性,所以还要循环判断数组2有没有遍历完。
算法代码:
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @author zxqj 2024/1/8 10:18
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
let arrayList = [];
let k = 0;
for (let i = 0; i < nums1.length; i++) {
for (let j = k; j < nums2.length; j++) {
if (nums1[i] > nums2[j]) {
arrayList.push(nums2[j]);
k++;
}
else break;
}
arrayList.push(nums1[i]);
}
if (k < nums2.length) {
for (let j = k; j < nums2.length; j++) {
arrayList.push(nums2[j]);
}
}
const total = nums1.length + nums2.length;
if (total % 2 === 1) {
const a1 = Math.floor(total / 2);
return arrayList[a1];
} else {
const a1 = Math.floor(total / 2)-1;
const a2 = Math.floor(total / 2);
const data = (arrayList[a1] + arrayList[a2]) / 2;
return data;
}
};