LeetCode:4.寻找两个正序数组的中位数(难度:🌟🌟🌟)

115 阅读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

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

解法一 (ts):

思路: 空间复杂度可以优化成 O(1), 因为我们实际不需要记录整个数组,至多只需要记住2个数字:

m+n 为奇数时,1个,既中位数 m+n 为偶数时,2个,中间两个数 因此可以排序用2个指针在标识当前数组比较的位置即可

function findMedianSortedArrays(nums1: number[], nums2: number[]): number {
    const isNumber = (val: number): val is number => typeof val === "number" && val === val;
    const totalLen = nums1.length + nums2.length;

    let n1 = 0; // nums1 的下标
    let n2 = 0; // nums2 的下标
    let res = 0; // 记住中位数的值
    let prevRes = 0; // 记录前一位的位置,偶数时使用

    for (let i = 0; i <= totalLen / 2; i++) {
        const val1 = nums1[n1];
        const val2 = nums2[n2];

        prevRes = res;
        if (!isNumber(val2) || // 其中一方不存在
            isNumber(val1) && val1 < val2) { // 或者当前比较中比较小
            res = val1;
            n1++;
        } else {
            res = val2;
            n2++;
        }
    }

    return totalLen % 2 ? res : (res + prevRes) / 2
};

假如两个数组是nums1 = [1, 2] 和 nums2 = [3, 4],函数的执行过程如下:

  1. 定义 isNumber 函数。
  2. 计算总长度 totalLentotalLen 的值为 4。
  3. 初始化 n1n2 和 res 的值为 0,prevRes 的值为 0。
  4. 进入循环。第一次迭代时,变量 i 的值为 0,此时 val1 的值为 1,val2 的值为 3。因为 val1 小于 val2,所以将 res 的值设置为 1,将 n1 的值加 1。
  5. 第二次迭代时,变量 i 的值为 1,此时 val1 的值为 2,val2 的值为 3。因为 val1 小于 val2,所以将 res 的值设置为 2,将 n1 的值加 1。
  6. 第三次迭代时,变量 i 的值为 2,此时 val1 的值为 undefined,val2 的值为 3。因为 val1 不是数值,所以将 res 的值设置为 3,将 n2 的值加 1。
  7. 第四次迭代时,变量 i 的值为 3,此时 val1 的值为 undefined,val2 的值为 4。因为 val1 不是数值,所以将 res 的值设置为 4,将 n2 的值加 1。
  8. 退出循环。
  9. 计算中位数的值。因为总长度是偶数,所以中位数的值为 (2 + 3) / 2 = 2.5
  10. 返回中位数的值。

解法二(js):

不考虑时间复杂度的话,这也是作者想到的方法~~

虽说有点low哈哈哈哈

var findMedianSortedArrays = function(nums1, nums2) {
  let arr = nums1.concat(nums2).sort((a, b) => a - b)
  return arr.length % 2 === 0 ? (arr[arr.length / 2 - 1] + arr[arr.length / 2]) / 2 : arr[(arr.length - 1) / 2]
}

首先利用 ES新增特性 将两个数组通过 concat 合并,然后 sort 进行排序,最后判断奇偶得到结果~

总结🌟:

解法一的提交结果:

image.png

解法二的提交结果: image.png

最后🌟:

☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start,

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。