leetcode之两个排序数组的中位数 Median of Two Sorted Arrays

感觉这题比较经典,之前自己用4个指针指来指去,把自己都绕晕了,现在发现2个指针就行。找数组中位数,相当于找第k个元素,k=(nums1.size()+nums2.size())/2。

4. Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

详细题解请见九章算法微博: http://weibo.com/3948019741/Bz1uAswtv

以下为代码

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
* 本参考程序来自九章算法,由 @九章算法 提供。版权所有,转发请注明出处。
* - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
* - 现有的面试培训课程包括:九章算法班,系统设计班,算法强化班,Java入门与基础算法班,Android 项目实战班,
* - Big Data 项目实战班,算法面试高频题班, 动态规划专题班
* - 更多详情请见官方网站:http://www.jiuzhang.com/?source=code
*/
class Solution {
public:
/*
对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1] ,
若n为偶数,则中位数(a[n / 2] + a[n / 2 + 1]) / 2
如果我们可以在两个数列中求出第K小的元素,便可以解决该问题
不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素
取A[k / 2] B[k / 2] 比较,
如果 A[k / 2] > B[k / 2] 那么,所求的元素必然不在B的前k / 2个元素中(证明反证法)
反之,必然不在A的前k / 2个元素中,于是我们可以将A或B数列的前k / 2元素删去,求剩下两个数列的
k - k / 2小元素,于是得到了数据规模变小的同类问题,递归解决
如果 k / 2 大于某数列个数,所求元素必然不在另一数列的前k / 2个元素中,同上操作就好。
*/
double findKth(vector<int>& A, vector<int>& B, int A_st, int B_st, int k) {
// 边界情况,任一数列为空
if (A_st >= A.size()) {
return B[B_st + k - 1];
}
if (B_st >= B.size()) {
return A[A_st + k - 1];
}
// k等于1时表示取最小值,直接返回min
if (k == 1) return min(A[A_st], B[B_st]);
int A_key = A_st + k / 2 - 1 >= A.size() ? INT_MAX : A[A_st + k / 2 - 1];
int B_key = B_st + k / 2 - 1 >= B.size() ? INT_MAX : B[B_st + k / 2 - 1];
if (A_key < B_key){
return findKth(A, B, A_st + k / 2, B_st, k - k / 2);
} else {
return findKth(A, B, A_st, B_st + k / 2, k - k / 2);
}
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int sum = nums1.size() + nums2.size();
double ret;
if (sum & 1) {
ret = findKth(nums1, nums2, 0, 0, sum / 2 + 1);
} else {
ret = ((findKth(nums1, nums2, 0, 0, sum / 2)) +
findKth(nums1, nums2, 0, 0, sum / 2 + 1)) / 2.0;
}
return ret;
}
};

本文标题:leetcode之两个排序数组的中位数 Median of Two Sorted Arrays

文章作者:微石

发布时间:2018年05月30日 - 18:05

最后更新:2018年07月19日 - 11:07

原始链接:akihoo.github.io/posts/3e60c6a7.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。