一、前言🌟
哈喽,小伙伴们,我是泽南👨🎓。不管你是准备跳槽还是在职苟着,都一起行动起来,顺应这个内卷时代干点该干的事儿👣。所以,赶紧跟着我的步伐卷起来吧⏰,变强从这一刻开始!➕🧈
二、题目介绍🌟
给定两个大小分别为 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 == mnums2.length == n0 <= m <= 10000 <= n <= 10001 <= 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],函数的执行过程如下:
- 定义
isNumber函数。 - 计算总长度
totalLen,totalLen的值为 4。 - 初始化
n1、n2和res的值为 0,prevRes的值为 0。 - 进入循环。第一次迭代时,变量
i的值为 0,此时val1的值为 1,val2的值为 3。因为val1小于val2,所以将res的值设置为 1,将n1的值加 1。 - 第二次迭代时,变量
i的值为 1,此时val1的值为 2,val2的值为 3。因为val1小于val2,所以将res的值设置为 2,将n1的值加 1。 - 第三次迭代时,变量
i的值为 2,此时val1的值为 undefined,val2的值为 3。因为val1不是数值,所以将res的值设置为 3,将n2的值加 1。 - 第四次迭代时,变量
i的值为 3,此时val1的值为 undefined,val2的值为 4。因为val1不是数值,所以将res的值设置为 4,将n2的值加 1。 - 退出循环。
- 计算中位数的值。因为总长度是偶数,所以中位数的值为
(2 + 3) / 2 = 2.5。 - 返回中位数的值。
解法二(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 进行排序,最后判断奇偶得到结果~
总结🌟:
解法一的提交结果:
解法二的提交结果:
最后🌟:
☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start,
🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。