4.寻找两个正序数组的中位数
我的解法
第一反应是两个数组排个序直接定位,不过这样必爆内存。
最后的解法是分类讨论了一下,计算出中位数前需要扔掉多少个元素(假设k个),然后用两个指针遍历两个数组,跳过k个元素后就可以确定中位数。
缺点是边界情况特别多,讨论起来很麻烦(指针是否到数组尾部,元素数量的奇偶,跳过k个元素后还要再判定一下nums1[i], nums1[i+1], nums2[j], nums2[j+1]的大小关系),是一种容易理解但代码写起来很麻烦的解法。
官方解法
方法一的基础是我的解法,为了降低时间复杂度使用了二分查找的方法,通过比较nums1[k/2-1]和nums2[k/2-1],可以直接排除掉k/2个元素。同样注意边界情况(越界;空数组;k=1)。
评论区有大佬给出我解法的优化版,无论sum是奇数还是偶数,总需要遍历sum/2+1次,区别是sum奇数只需要第sum/2+1次的结果,而sum偶数额外需要第sum/2次的结果,用left保存一下即可。注意越界的情况。
方法二划分数组,主要是一个重分析的方法,确定j = (m+n+1)/2 - i后,对i进行二分查找,确定对应i和j的值。
本质也是二分查找的方法,通过分析i和j降低了i的查找范围。
知识点
二分查找