【leetcode长跑】开个头 Median of Two Sorted Arrays

你们好,我叫张小猪。面试

自第一篇收集向的文章发布后,近 1 年半没更新这个专栏了。最近面试中发现将近 60% 的候选人对于 bubble sort 面露难色,因而心悸于本身也忘记了不少大学的内容,遂有时间就写写 leetcode 好了,也不荒废当初开了这个地方。路途遥远,且行且珍惜。segmentfault

今天是 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)).编辑器

题目描述内容比较少,大意就是提供两个有序数组,须要找到这两个数组的中间值。
给了两个例子:oop

nums1 = [1, 3]
nums2 = [2]

The median is 2.0
nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

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

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

基于以上两点,咱们获得要作的事情是:leetcode

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

那么开始写代码吧(吐槽一下 leetcode 的编辑器并不太好用):get

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%,算是能够接受吧。it

想一想最近快要到双 11 了,别人都是买包买衣买香水、家具电器旅行飞,小猪只是连着关注了几天显卡和 CPU,还舍不得剁手。哎,说多了都是泪啊,仍是洗洗猪鼻子睡了吧。。。

相关文章
相关标签/搜索