此题在leetcode中评级为hard,目的是在O(log(m+n))的时间复杂度情况下解决问题。用常规O(m+n)的算法很容易求得结果,但
显然不符合时间复杂度的要求。因此,这道题的解题分析主要还是利用分治算法去考虑,这也是本题的难点所在。
一、原题叙述
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
二、思路分析
题目中需要求出的结果是中位数,中位数的特点是其以后的数都比它大,前面的数都比它小。又因为两个数组都已经是有序数组,
因为我们所需要的结果就是数组a中的第i个元素和数组b中第j个元素,使得i+j-2等于两个数组长度和的一半,所以此题就可以转换成求i
j这两个值的问题了。在数组a中确定i以及在数组b中确定j,此时可以采用二分查找的方法,通过不断缩小查找范围来确实所需要
查找的值,也符合题目中所要求的分治算法的思想。
三、算法实现
class Solution {
public:
int getkth(int s[], int m, int l[], int n, int k){
//确保m < n
if (m > n)
return getkth(l, n, s, m, k);
if (m == 0)
return l[k - 1];
if (k == 1)
return min(s[0], l[0]);
//递归过程
int i = min(m, k / 2), j = min(n, k / 2);
if (s[i - 1] > l[j - 1])
return getkth(s, m, l + j, n - j, k - j);
else
return getkth(s + i, m - i, l, n, k - i);
return 0;
}
double findMedianSortedArrays(int A[], int m, int B[], int n) {
//总长度的一半
int l = (m + n + 1) / 2;
int r = (m + n + 2) / 2;
return (getkth(A, m ,B, n, l) + getkth(A, m, B, n, r)) / 2.0;
}
};
四、个人心得
主要是要理解分治算法的核心思想,将一个大问题分解为几个小问题的分别解决,将这种思想跟题目结合起来就比较容易得出
结果了,通过二分法不断缩小查找范围,直至得到所要的结果然后返回。