「LeetCode打卡」04.寻找两个正序数组的中位数

108 阅读1分钟

🍑 题目详情

给定两个大小分别为 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)

04.jpeg

解法三:二分法

[已猝]

🍼 解题代码

解法一:

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
    }
};