给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
中位数:将有序数字分为等长的两部分,其中一部分的数字始终比另一部分要大。
思路:因为题目中的两个数组都是有序的
left_A | right_A
A[0], A[1], …, A[i-1] | A[i], A[i+1], …, A[m-1]
我们可以将数组A分为两部分 i 和 n-i
left_B | right_B
B[0], B[1], …, B[j-1] | B[j], B[j+1], …, B[n-1]
同理数组B也可以分为两部分 j 和 m-j
left_part | right_part
A[0], A[1], …, A[i-1] | A[i], A[i+1], …, A[m-1]
B[0], B[1], …, B[j-1] | B[j], B[j+1], …, B[n-1]
我们将数组A和B的两部分分别形成两部分来寻找中位数,根据中位数的特征我们知道左边元素的个数与右边元素的个数应该相同或者差一个,所以i+j=n-i+m-j(或者n-i+m-j+1)所以我们可以的到 j=(m+n+1)/2,并且我们也可以知道B[j-1]<A[i]并且A[i-1]<B[j]才可以;
我们的任务就是寻找到合适的 i 的位置
我们可以根据B[j-1] 与A[i]的关系和A[i-1]与B[j]的关系来判断此时的 i 比我们希望找到的 i 大还是小,eg 如果B[j-1]>A[i] 了那么我们的 i 就是比目标 i 要小。所以我们不妨设imin=0,imax=nums的长度,这里没有说明到底是nums1还是nums2是因为我们如果要确保 j>0 就必须让 i 是两个数组中较大的那个 这个只需要两个数组互换就可以做到 所以imin=0,imax=较长数组的长度。然后取二者的平均值得到 i 根据 i 的大小的判断来决定改变imin还是imax 如果 i 比较小 那么我们让imin=i+1,如果i比较大 那么我们让imax=i-1,直到得到合适的i 合适的i的特征为 满足上面的两个大小关系 或者 i=0 或者j=0(j=0 意味着i=较长数组的数组长度) 然后我们就可以得到i的合适位置 如果m+n为奇数则中位数为B[j-1] A[i-1]中较大的 ,如果m+n为偶数中位数则为B[j-1] A[i-1]中较大的数加上A[i] B[j]中较小的数取平均值