大家好,我叫张小猪。
自第一篇收集向的文章发布后,近 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,还舍不得剁手。哎,说多了都是泪啊,还是洗洗猪鼻子睡了吧。。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。