There are two sorted arrays A and B 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)).
这题最初的想法就是 MergeSort之后,然后直接查看index=k-1的那货 时间复杂度是O(n)
改进一下:MergeSort的时候没必要全部Merge,我们要找的是第k个元素,直接用个计数器时刻紧盯着已经有多少个元素Merge了,到第K个的时候就是找到了,直接return,复杂度是O(K)
再改进:做算法题是必须对 Sorted 这类词非常敏感,一想到有序你就必须联想到 二分,不然白白浪费了 这个条件
注:以下分析援引自:http://fisherlei.blogspot.com/2012/12/leetcode-median-of-two-sorted-arrays.html
如果 (m/2 + n/2) > k,那么意味着,当前中位数取高了,正确的中位数要么在 Section 1或者Section3中。
如果A[m/2] > B[n/2], 意味着中位数肯定不可能在Section 2里面,那么新的搜索可以丢弃这个区间段了。同理可以推断出余下三种情况,如下所示:
简单的说,就是或者丢弃最大中位数的右区间,或者丢弃最小中位数的左区间。
注意:丢弃区间的时候一定得把中间那货一起甩掉,我在这个边界上错了好几次,挂了好几次
class Solution { public: double findMedianSortedArrays(int A[], int m, int B[], int n) { if ((m + n) % 2 == 0) { return (getMedian(A, m, B, n, (m+n)/2 + 1) + getMedian(A, m, B, n, (m+n)/2))/2.0; } else { return getMedian(A, m, B, n, (m+n)/2 + 1) * 1.0; } } static int getMedian(int a[], int alen, int b[], int blen, int kth) { assert(a != NULL && b != NULL); if (alen == 0) return b[kth-1]; if (blen == 0) return a[kth-1]; if (kth == 1) return (a[0] <= b[0] ? a[0] : b[0]); if (a[alen/2] <= b[blen/2]) { if ((alen/2 + blen/2) >= (kth - 1)) { return getMedian(a, alen, b, blen/2, kth); } else { return getMedian(a + alen/2 + 1, alen - (alen/2 + 1), b, blen, kth - (alen/2 + 1)); } } else { if ((alen/2 + blen/2) >= (kth - 1)) { return getMedian(a, alen/2, b, blen, kth); } else { return getMedian(a, alen, b + blen/2 + 1, blen - (blen/2 + 1), kth - (blen/2 + 1)); } } } };