给定两个大小分别为
m
和n
的正序(从小到大)数组nums1
和nums2
。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为
O(log (m+n))
。
示例 1:
输入:nums1 = [1,3], nums2 = [2] | |
输出:2.00000 | |
解释:合并数组 = [1,2,3] ,中位数 2 |
示例 2:
输入:nums1 = [1,2], nums2 = [3,4] | |
输出:2.50000 | |
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 |
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
解法一:遍历查找(时间复杂度 O (m+n))
思路:将两个数组合并起来,从小到大找到中间的那个数即可,当然也不需要合并两个数组,只需要将两个数组都从头开始找,相互比较,直到遍历到(m + n)/2 那里。需要注意的是合并的总数为偶数时,需要取中间两位数进行计算。还需要注意两个数组的临界点位置。
class Solution { | |
public double findMedianSortedArrays(int[] nums1, int[] nums2) { | |
// 两个数组的长度 | |
int length1 = nums1.length; | |
int length2 = nums2.length; | |
// 记录中间值 | |
int left = -1 ,right = -1; | |
// 两个数组的下标位置 | |
int index1 = 0,index2 = 0; | |
// 只需遍历到中位数的位置即可 | |
for (int i = 0; i <= (length1 + length2) / 2; i++){ | |
// 记录前一个的值(用于总长度为偶数时进行计算) | |
left = right; | |
// 当前数组 1 中的值小于当前数组 2 中的值时,将数组 1 的下标位置右移 | |
if (index1 < length1 && (index2 >= length2 || nums1[index1] <= nums2[index2])){ | |
right = nums1[index1++]; | |
continue; | |
} | |
// 否则将数组 2 的下标位置右移 | |
right = nums2[index2++]; | |
} | |
// 如果是偶数,则计算前一个值和当前值 | |
if ((length1 + length2) % 2 == 0){ | |
return (left + right) / 2.0; | |
} | |
// 如果是奇数,返回当前值 | |
return right; | |
} | |
} |
想要达到 O (log (m+n)) 时间复杂度,得采用二分查找,详情查看力扣题解。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays/