6

大家好,我叫张小猪。

自第一篇收集向的文章发布后,近 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

看完描述和例子后,第一反应就是合并两个数组,然后找到中间位置即可。不过这样需要两个数组各扫一遍,然而我们的目的只是要取到中间值,似乎并不用完整的扫一遍。那就按照这个思路看看吧。

首先,根据例子可以看出,偶数和奇数个长度对于最终结果的计算是会有影响的。即奇数个我们能直接取到中间值,而偶数个需要取到最靠近中间的两个值然后取平均数。那么也就意味着,我们最终要记录的值可能是两个。
然后,由于两个数组都是有序的,那么他们的中间值索引其实就是做合并操作过程中的索引。

基于以上两点,我们得到要做的事情是:

  1. 计算中间值的索引
  2. 做有序数组合并
  3. 得到结果

那么开始写代码吧(吐槽一下 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,还舍不得剁手。哎,说多了都是泪啊,还是洗洗猪鼻子睡了吧。。。


张小猪粉鼻子
2.9k 声望407 粉丝

一只粉色的小猪,喜欢写写代码,看看电影,玩玩游戏社恐,不太会讲话永远跟不上热点