算法学习——寻找两个正序数组中位数

寻找两个正序数组中位数

这题难度比较大,记一下详细的思路

由于灵神的解析里面写的数组名字是a和b,题目里面又是nums1和nums2,我下面写的名字两种都有写,知道是一样的就行。

首先明确中心思想:将两个数组内的元素均匀分组,第一组的最大值小于等于第二组最小值。下面是几个关键点:

  1. 如果元素总个数为奇数,我们把第一组多分一个,最后返回第一组的最大值;如果是偶数,平均分,返回第一组最大值和第二组最小值的平均数。

  2. 由于我们是不断去看num1数组的元素是否属于第一组,最开始的时候是假设nums1数组有0个元素在第一组中的。为了避免nums2数组的元素全部用上都凑不够第一组所需要的元素个数,最开始我们判断两个数组的长度,如果nums1比nums2长,就交换,保证nums1长度肯定小于Nums2。

  3. 对于二分法,其实就是找到nums1中满足ai<=bj+1的最大的元素位置,我们可以写成闭区间,left=0,right=m-1,区间内的元素是不知道是否满足ai<=bj+1的元素。right右边(不包含)是不满足的,left左边(不包含)是满足的。

  4. i之间赋值成二分的位置。注意j和i的关系:

  1. 和之前二分一样:如果满足条件,left=left+1;不满足right=right-1;

  2. 注意最后返回的位置:right会在left左边一位,我们这样想:right右边的全是不满足的,left左边的都是满足的,因此最大的满足的位置就在当前right的位置(这和之前结果是Left是相反的,但是原理都是一样的,学会用区间表示的意义判断即可,可以画个图)。

  3. 最后确定值的时候要注意两种特殊情况:

(1)nums1中元素全部不在第一组,这时候i=-1,我们的ai不能之间赋值,要赋值成负无穷:

其实这里还要注意,有可能bj正好是b数组的最后一个元素,那么bj+1也就是溢出了,这时候赋值成正无穷。

(2)nums1中的元素全部都在第一组,这时候i=m-1,ai+1是溢出的,要赋值成正无穷。

同样也要注意,这时候有可能a数组的元素与第一组的元素完全相等,b数组没有元素在第一组,j=-1,bj要赋值成负无穷。

  1. 这里再记一下为什么不用最开始讲的在数组前后补正负无穷的方法:因为插入的步骤使得时间复杂度增大,即使用了二分也不能简化成log(m+n)的复杂度,最后我们的复杂度其实是log(min(m,n))

posted @ 2025-11-23 16:25  卡子卡卡  阅读(0)  评论(0)    收藏  举报