- 寻找两个正序数组的中位数
给定兩个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))
今天是诡异的一道困难题,为什么说诡异呢一会就知道啦。拿到题目两个有序数组吗,寻找两个数组中的中位数ok,把两个数组连成一个数组再找嘛merge一下两個数组就出来了呗。但是题目要求时间复杂度为O(log(m+n))按道理归并是没办法满足的。诡异的事情来了抱着先解出题目的想法,先归并了一下过了。。什么鬼说好的时间复杂度要求呢?哈哈哈
OK系统给过归给过,还是要看一看更优秀的解法降低时间复杂度到log级别,等同於每一次迭代的操作都要减半经典二分查找就来啦。寻找两个数组的中位数设中位数排序在第k位,则即寻找两个数组中第k大的元素利用二分查找的思路,设两个数组为AB,官方给出题解如下取A[k/2-1],B[k/2-1](为方便分别记为AkBk)进行比较,两者前面分别有A[0…k/2-2],
Bk前方的元素必然比Ak尛但Ak前方可能存在比Bk大的数,因此Bk最大可能也只可能是第k-1个数排除Bk前方所有数。
类似Ak最多可能是k-1个数。排除Ak前方所有数
排除之后呢?个人觉得这里有一点点难理解当然,因为我菜各位大佬肯定能很快看出来。不各位肯定能自己想出来,不用像我这样自己再理思路实际上经过一次比较后,我们排出了k/2个元素因此,接下去我们要寻找的目标值是剩余数组中的第(k-k/2)个元素所以要更新k值,同時变更AkBk。注意在编码时,我们还要处理一些边界情况当第一个数组越界时,说明第k个必然不在A中剩余数组都是B的元素,则第k个就昰当前B的子数组的第k个反之同理。当k==1是选取A和B中当前的最小值即可。