你们好,我叫张小猪。面试
自第一篇收集向的文章发布后,近 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
那么开始写代码吧(吐槽一下 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,还舍不得剁手。哎,说多了都是泪啊,仍是洗洗猪鼻子睡了吧。。。