# 每日一题(11):寻找两个正序数组的中位数
# 开始
今天飘了
觉得中等题不得劲
找个困难题刷刷
感觉怎么差不多...
这道题啥也不说
一看就老双指针了
思路也很简单,但是需要hack两处
- 计算一下两个数组加起来总长度
- 找到停止遍历的那个点
last
,记得奇偶数分开处理 - 整两个指针
i, j
- 整两个暂存区
curr,prev
,这里如果是奇数长度就只需要用到一个,偶数需要用到两个 - 当
i + j < last
,这里hack一下来处理数组越界问题,当其中一个数组遍历完了,我们就给它个Integer.MAX_VALUE
确保可以让剩余数字被处理(是不是很机智 - 后面就是枯燥的
i++/j++
移动指针以及返回结果了
看下代码实现吧
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int l = nums1.length + nums2.length;
int last;
if (l % 2 == 0) {
last = l / 2 + 1;
} else {
last = (l + 1) / 2;
}
int curr = 0;
int prev = 0;
int i = 0;
int j = 0;
while (i + j < last) {
prev = curr;
int num1 = i == nums1.length ? Integer.MAX_VALUE : nums1[i];
int num2 = j == nums2.length ? Integer.MAX_VALUE : nums2[j];
if (num1 < num2) {
curr = num1;
i++;
} else {
curr = num2;
j++;
}
}
if (l % 2 == 0) {
return (prev + curr) / 2.0;
} else {
return curr;
}
}
}
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
30
31
32
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
30
31
32
以及还不错的执行效率
一次过
看了官方题解
发现自己居然直接用了相对优秀的思路
感觉可以困难题起步了(飘了飘了
下次继续~