🍑 题目详情
给定两个大小分别为 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
🍭 解题思路
这道题难度为hard的原因我认为可能有两个,一个是限制时间复杂度为 O(log (m+n)),第二个是可以有很多问题可以去解决这个问题。
解法一:暴力解法
将两个数组先进行合并,然后再进行排序,再根据奇偶数获取中位数。
时间复杂度:O(m+n)
解法二:
类似于归并排序,可以先判断中位数所在的位置,然后设定两个指针 i 和 j 分别指向两个数组的首位,遍历判断 nums1[i] 和 nums2[j] 的大小,通过一个栈从小到大存储小值,达到中位数所在位置后,根据奇偶,对栈进行出栈拿到相应的中位数。
时间复杂度:O(m+n)
解法三:二分法
[已猝]
🍼 解题代码
解法一:
var findMedianSortedArrays = function(nums1, nums2) {
const array = [...nums1, ...nums2].sort()
const len = array.length
if (len % 2) {
return array[Math.floor(len / 2)]
} else {
return (array[len / 2 - 1] + array[len / 2]) / 2
}
}
解法二:
var findMedianSortedArrays = function(nums1, nums2) {
const totalLength = nums1.length + nums2.length
const middleIndex = Math.floor(totalLength / 2)
let i = 0, j = 0
const stack = []
while (true) {
if (nums2[j] === undefined || nums1[i] <= nums2[j]) {
stack.push(nums1[i++])
} else if (nums1[i] === undefined || nums1[i] >= nums2[j]) {
stack.push(nums2[j++])
}
if (i + j > middleIndex) break
}
if (totalLength % 2 > 0) {
// 表示奇数
return stack.pop()
} else {
// 表示偶数
return (stack.pop() + stack.pop()) / 2
}
};