代码仓库:Github | Leetcode solutions @doubleZ0108 from Peking University.
- 解法1: 最基础的想法肯定是引入一个新数组,把两个数组都放进来,然后排序,直接根据奇偶选中位数,但感觉肯定会超时或者爆显存
- 解法2(T88% S30%): 因为题干强调了log的时间复杂度,所以肯定是二分查找的思想,通过两个指针分别指向两数组的开头,求解中位数本质上就是把前n/2-1个最小的数扔掉,这个思想可以很好的通过二分查找来实现,不过需要注意的是有可能一个数组很短而另一个很长,因此需要判断是否有指针已经到尾部,如果是的话只在另一个数组中移动就可以了。扔完n/2-1个数之后,根据原数组长度的奇偶性来选取中位数即可,一个小技巧,可以直接把之后的数组切片合并成一个数组然后讨论第0号和1号元素,这样省时方便又不用担心爆内存(因为至少有一半已经被排除掉了)
var findMedianSortedArrays = function(nums1, nums2) {
var flag = (nums1.length + nums2.length) % 2 == 0; // 中位数是中间两个数的平均
var midNum = Math.floor((nums1.length + nums2.length)/2);
for (var i=0, j=0; i+j<(flag ? midNum-1 : midNum); ) {
if (i == nums1.length) {
j++;
continue;
} else if (j == nums2.length) {
i++;
continue;
}
if (nums1[i] < nums2[j]) {
i++;
} else {
j++;
}
}
var tmp = [...nums1.slice(i), ...nums2.slice(j)].sort((a,b)=>a-b);
if (!flag) {
return tmp[0];
} else {
return (tmp[0]+tmp[1]) / 2;
}
};
该博客介绍了如何利用二分查找算法在O(log(min(m,n)))的时间复杂度内找到两个已排序数组的中位数。作者提供了两种解法,第一种是简单的排序合并数组,可能会导致超时或内存问题;第二种是优化的二分查找方法,考虑了数组长度的奇偶性,并避免了不必要的内存消耗。代码实现中,通过双指针在两个数组间移动,最终找到并返回中位数。

被折叠的 条评论
为什么被折叠?



