题目描述
给定两个大小分别为 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
思路
首先想到的是合并两个数组,让数组有序,然后就能求中位数了。
但是如果合并的话就是N(m+n)的时间复杂度了。
但是这里可以对排序这里进行小优化加快速度。
我们已经知道两个数组的长度了,所以我们可以求出中位数的下标。
三目运算符
数组长度为单数 ? 中位数=数组长度/2: 中位数为 ([数组长度/2-1] + [数组长度/2])/2
所以我们在合并数组的时候可以创建一个临时数组长度为数组长度/2+1的临时数组
当数组长度达到这个长度的时候就可以返回中位数了
代码
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int length1 = nums1.length;
int length2 = nums2.length;
int sum = length1 + length2;
int l = 0;
int r = 0;
int index = 0;
int mid = sum >> 1;
int[] tmpArray = new int[mid + 1];
boolean flag = sum % 2 == 0;
while (l < length1 && r < length2 && index <= mid) {
tmpArray[index++] = nums1[l] <= nums2[r] ? nums1[l++] : nums2[r++];
}
while (l < length1 && index <= mid) {
tmpArray[index++] = nums1[l++];
}
while (r < length2 && index <= mid) {
tmpArray[index++] = nums2[r++];
}
if (flag) {
return (double) (tmpArray[mid - 1] + tmpArray[mid]) / 2;
}
return tmpArray[mid];
}
}