4. 寻找两个正序数组的中位数
1. 简介
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
示例 1:
1 | 输入:nums1 = [1,3], nums2 = [2] |
示例 2:
1 | 输入:nums1 = [1,2], nums2 = [3,4] |
示例 3:
1 | 输入:nums1 = [0,0], nums2 = [0,0] |
示例 4:
1 | 输入:nums1 = [], nums2 = [1] |
示例 5:
1 | 输入:nums1 = [2], nums2 = [] |
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
进阶:你能设计一个时间复杂度为 O(log (m+n))
的算法解决此问题吗?
2. 题解
2.1. 合并数组
最简单的做法就是,合并两个数组,然后进行排序,取出中位数即可。
需要注意的是奇数长度和偶数长度的数组,中位数的取法不同。
1 | class Solution: |
2.2. 利用二分法
题目希望我们以 $O(log(M+N))$ 的时间复杂度解决此题,log
的时间复杂度,加上两个数组已经是正序的,这可以联想到二分法,因此考虑用二分法解决此题。
根据第一种解法,设合并后的数组长度为 L
,奇数长度的数组中位数是第 L//2 + 1
个数字,偶数长度的数组中位数是第 L//2
和 L//2 +1
,其实相当于寻找第 k
小的数字1,k
是 L//2
或 L//2 + 1
。
1 | class Solution: |
参考资料
1. LeetCode 官方题解:寻找两个有序数组的中位数 ↩