摘要:自第一篇收集向的文章发布后,近年半没更新这个专栏了。今天是分类中第一个的,叫做。不过这样需要两个数组各扫一遍,然而我们的目的只是要取到中间值,似乎并不用完整的扫一遍。那么也就意味着,我们最终要记录的值可能是两个。
大家好,我叫张小猪。
自第一篇收集向的文章发布后,近 1 年半没更新这个专栏了。最近面试中发现将近 60% 的候选人对于 bubble sort 面露难色,于是心悸于自己也忘记了很多大学的内容,遂有时间就写写 leetcode 好了,也不荒废当初开了这个地方。路途遥远,且行且珍惜。
今天是 Algorithms 分类中第一个 Hard 的,叫做 Median of Two Sorted Arrays。描述如下:
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
题目描述内容比较少,大意就是提供两个有序数组,需要找到这两个数组的中间值。
给了两个例子:
nums1 = [1, 3] nums2 = [2] The median is 2.0
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5
看完描述和例子后,第一反应就是合并两个数组,然后找到中间位置即可。不过这样需要两个数组各扫一遍,然而我们的目的只是要取到中间值,似乎并不用完整的扫一遍。那就按照这个思路看看吧。
首先,根据例子可以看出,偶数和奇数个长度对于最终结果的计算是会有影响的。即奇数个我们能直接取到中间值,而偶数个需要取到最靠近中间的两个值然后取平均数。那么也就意味着,我们最终要记录的值可能是两个。
然后,由于两个数组都是有序的,那么他们的中间值索引其实就是做合并操作过程中的索引。
基于以上两点,我们得到要做的事情是:
计算中间值的索引
做有序数组合并
得到结果
那么开始写代码吧(吐槽一下 leetcode 的编辑器并不太好用):
var findMedianSortedArrays = function(nums1, nums2) { var sumLen = nums1.length + nums2.length, targetLen = sumLen >>> 1, loop = targetLen + 1, i = 0, // for num1 index j = 0, // for num2 index x, y; while (loop--) { x = y; if (nums1[i] === undefined) { y = nums2[j++] } else if (nums2[j] === undefined) { y = nums1[i++]; } else if (nums1[i] < nums2[j]) { y = nums1[i++]; } else { y = nums2[j++]; } } return targetLen << 1 === sumLen ? (x + y) / 2 : y; };
Test case 通过后连续提交了几次,时间在 beats 85% 左右浮动,最低 72%,最高 97%,算是可以接受吧。
想想最近快要到双 11 了,别人都是买包买衣买香水、家具电器旅行飞,小猪只是连着关注了几天显卡和 CPU,还舍不得剁手。哎,说多了都是泪啊,还是洗洗猪鼻子睡了吧。。。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/89481.html
摘要:复杂度思路因为要找中位数,又是在两个的数组里面。所以考虑用二分法。二分法经常适合的接下来考虑如何二分。然后对和进行比较,记为和。所以为了缩小搜索范围,我们可以扔掉这些数,在的剩下来的数中和的数组中接着找。说明中没有个数可以寻找。 Leetcode[4] Median of two sorted arrays There are two sorted arrays nums1 and n...
摘要:解法解法应该是最常见的一种解法,就是将两个数组头尾相加合并起来,然后重新排序,例如输入两个数组,合并之后变为,然后求出中位数。如果两个数组长度和为偶数,那么中位数有两个,否则只有一个 题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the tw...
摘要:由于要求的时间,所以选择二分法。思路是找到两个数组合并起来的第个元素。这样只需计算两个数组的中位数是第几个元素,代入功能函数即可。据此,根据二分法的性质,我们在递归时可以将前即个元素排除。 Problem There are two sorted arrays A and B of size m and n respectively. Find the median of the tw...
摘要:最新解法及思路有两个有序数组和,他们的大小各是和,请找出这两个数组所有数的中位数,总得时间复杂度不超过归并计数法复杂度时间空间思路如果对时间复杂度没有要求,这个方法是实现起来最简单的,我们只需要从下往上依次数个元素即可。 Median of Two Sorted Arrays 最新解法及思路:https://yanjia.li/zh/2018/11/... There are two...
摘要:难度为这个题目描述很清晰给出两个排序好的数组求这两个数组的中位数在解这个题的过程中会碰到以下的问题先合起来重新排序是不可行的时间复杂度太高为先归并排序也是不可行的时间复杂度为用类似桶排的方法时间复杂度为不可行可能会碰到多种全部大于或全部小于 There are two sorted arrays nums1 and nums2 of size m and n respectively...
阅读 1271·2021-10-27 14:14
阅读 3512·2021-09-29 09:34
阅读 2447·2019-08-30 15:44
阅读 1686·2019-08-29 17:13
阅读 2529·2019-08-29 13:07
阅读 842·2019-08-26 18:26
阅读 3327·2019-08-26 13:44
阅读 3194·2019-08-26 13:37