题目:
给定两个大小分别为 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
看到这题,我想起之前做过的三个升序数组找距离最短的三个数,可以用一个for循环处理,循环长度为三数组长度之和。于是有了思路,循环得到一个新的升序数组,然后找中位数就简单了。于是有了如下代码,代码是可行,不过效率不大行。
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
let total = nums1.length + nums2.length
let center = Math.floor(total/2) + 1
// 是否奇数
let flag = total % 2
let j=0
let k=0
let arr = []
for (let i = 0; i < (nums1.length + nums2.length); i++) {
if(nums1.length === 0) {
arr = nums2
break
}
if(nums2.length === 0) {
arr = nums1
break
}
if(nums1[j] > nums2[k]) {
if (k < nums2.length) {
arr.push(nums2[k])
k++
// k++
} else if (j < nums1.length) {
arr.push(nums1[j])
j++
}
} else {
if (j < nums1.length) {
arr.push(nums1[j])
j++
// j++
} else if (k < nums2.length) {
arr.push(nums2[k])
k++
// k++
}
// arr.push(nums1[k])
// j++
}
}
console.log(arr)
if (flag) {
return arr[center-1]
} else {
return (arr[center-1] + arr[center-2])/2
}
};
然后我又想到使用js自带的函数sort也是可以实现的,因为可以直接排好序。代码如下,效率也不行。
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
let arr = [...nums1, ...nums2].sort((a,b) => a>b ? -1 : 1)
console.log(arr)
let tmp = Math.floor(arr.length/2)
if(arr.length%2) {
return arr[tmp]
} else {
return (arr[tmp] + arr[tmp-1])/2
}
};