LeetCode 04 寻找两个正序数组的中位数

LeetCode 04 寻找两个正序数组的中位数


题目:
给定两个大小分别为 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
通过次数806,656提交次数1,940,252

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:
首先计算两数组总长度的中位置 (Len1+Len2)/2
如果总长度为偶数则取中位置两数求均值,如果是奇数直接返回中位置值
双指针从小到大开始遍历两数组,并且把每次遍历的值存在长度为2的临时数组nums
用一个指针指向临时数组后存入的数据等待替换新数据,每次存入后交替

图解:
过程如下图示: ( nums1=[1,2,3] nums2=[3,4,5] 中位置Center=2,3)
1 2 3
3 4 5
如果两数组都没遍历到边界,则比较大小,小指针向前移动,计数 Count,临时数组存储数据
1 2 3
3 4 5
count nums[0] nums[1] 临时数组下标
1 1 0 0

1 2 3
3 4 5
count nums[0] nums[1] 临时数组下标
2 1 2 1

1 2 3
3 4 5
count nums[0] nums[1] 临时数组下标
3 3 2 0

1 2 3
3 4 5
count nums[0] nums[1] 临时数组下标
4 3 3 1
遍历结束,总数6个数,取第3和第4个数求平均值返回,即 (nums[0]+nums[1])/2 = 3

代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len = nums1.length + nums2.length;
int center = len / 2;
boolean isOdd = (len % 2 == 1);
int[] nums = new int[2];
int cur = 0;
int p1 = 0;
int p2 = 0;
int count = 0;
while (true) {
if (p1 < nums1.length && p2 < nums2.length) {
if (nums1[p1] <= nums2[p2]) {
nums[cur] = nums1[p1++];
} else {
nums[cur] = nums2[p2++];
}
} else if (p1 < nums1.length) {
nums[cur] = nums1[p1++];
} else {
nums[cur] = nums2[p2++];
}
if (count++ == center) break;
cur = cur == 1 ? 0 : 1;
}
if (isOdd) {
return nums[cur];
}
return (nums[0] + nums[1]) / 2f;
}