Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
- 无重复字符的最长子串-难度困难
给定两个大小分别为 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
二、题目和思路分析:
这道题虽然标的困难,但实际上从解出题的角度来说,并不算困难。题目也比较易懂,意思是合并数组,然后取出数组的中位数即可。
合并数组可以用concat()方法,取中位数可以使用取余的方法判断,如果取余结果为1,说明是奇数,直接取数组下标中位数对应的值即可,如果取余结果为0,则说明是偶数,应该取下标两个中位数对应值的平均值。
这么想着,我就把代码敲出来了,结果运行发现不对,原来是忘记合并数组后要进行排序,于是又加了sort((a,b)=>{a-b})
进行正序排序,完美搞定!
说到这,题目中还有重要的一点忘记了,【题目要求:算法的时间复杂度应该为 O(log (m+n)) 】,这是什么意思呢?网上有张图大家可以看一下:
可知,当数组长度不断提升时,所需时间并不应该指数型增长,而是一个逐渐放缓的速度,在上面的解题思路中也可以看出,我们的计算时间并不会受数组长度的大幅度影响,而是log(m+n)的曲线。
三、代码:
代码实现如下:
var findMedianSortedArrays = function(nums1, nums2) {
let arr = nums1.concat(nums2).sort((a, b) => a - b)
let length = arr.length
let i = 0
let res = 0
console.log(arr,length,i,res)
if(length % 2 == 1){
i = --length/2
res = arr[i]
}else{
i = length/2
res = (arr[i]+arr[i-1])/2
}
return res
};
复制代码
四、总结:
解题的过程要认真仔细,一点失误就会导致答案不对,关于大O表示法,还要复习一下数学知识,最重要的还是思路。
加油吧!