【LeetCode】Median of Two Sorted Arrays

来源:互联网 发布:mac虚拟机能玩游戏吗 编辑:程序博客网 时间:2024/06/09 14:31

  1. 题目描述:

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)).

这题目做的非常头疼……O(m+n)的做法是显而易见的,方法也很多,但是题目明确说了要O(log(m+n)),那就十分困难了。

一开始的想法是对两个数组分别求中位数,然后再根据两个中位数的大小进行相应的判别。但是各种分支情况太多了,搞得头都晕了。后来自己边翻边看1337c0d3r的题解以后,确认这样的思考方向是没问题的,但是理得不够清楚。

实际上就算在看了解答以后仍然花了一段时间去理清思路,因为特例情况还是很多,需要一个一个去处理。递归的过程文章里说的很明白,就不再说了,这里说下终止递归的条件。

1、m=0或者n=0时,返回另一个数组的中位数。

2、m=1或者n=1时(A为m=1或者n=1时的A[0]或者B[0],j=n/2):

      A)m+n为偶数时:

            a)A>=B[j],median=B[j],min(A,B[j+1])

            b)A<B[j],median=B[j],max(A,B[j-1])

      B)m+n为奇数时:

            a)A>=B[j],median=B[j]

            b)A<B[j],median=max(B[j-1],A)

3、m=2或者n=2时:

      A)m+n为偶数时:

            a)A[0]>=B[j],median=B[j],min(B[j+1],A[0])

            b)A[1]<=B[j-1],median=B[j-1],max(B[j-2],A[1])

            c)else,median=max(B[j-1],A[0]),min(B[j],A[1])

      B)m+n为奇数时:

            a)A[0]>=B[j],median=min(B[j+1],A[0])

            b)A[1]<=B[j],median=max(B[j-1],A[1])

            c)else,median=B[j]

最后,不要忘记判定数组是否越界。

代码如下:

class Solution {public:double findMedianSortedArrays(int A[], int m, int B[], int n) {if (m == 0){if (n % 2 == 0)return (B[n / 2] + B[n / 2 - 1]) / 2.0;elsereturn B[n / 2] / 1.0;}if (n == 0){if (m % 2 == 0)return (A[m / 2] + A[m / 2 - 1]) / 2.0;elsereturn A[m / 2] / 1.0;}else if (m == 1)return getMedian1(A[0], B, n);else if (n == 1)return getMedian1(B[0], A, m);else if (m == 2)return getMedian2(A[0], A[1], B, n);else if (n == 2)return getMedian2(B[0], B[1], A, m);int i = m / 2, j = n / 2;int k(0);if (A[i] <= B[j]){if (m % 2 == 0)k = std::min(i - 1, n - j - 1);elsek = std::min(i, n - j - 1);return findMedianSortedArrays(A + k, m - k, B, n - k);}else{if (n % 2 == 0)k = std::min(j - 1, m - i - 1);elsek = std::min(j, m - i - 1);return findMedianSortedArrays(A, m - k, B + k, n - k);}}double getMedian1(int A, int B[], int n){int j = n / 2;double median(0);if ((n + 1) % 2 == 0){if (A >= B[j]){int b = (j + 1 < n) ? B[j + 1] : INT_MAX;median = (B[j] + std::min(A, b)) / 2.0;}else{int b = (j - 1 >= 0) ? B[j - 1] : INT_MIN;median = (B[j] + std::max(A, b)) / 2.0;}}else{if (A >= B[j]){median = B[j] / 1.0;}else{int b = (j - 1 >= 0) ? B[j - 1] : INT_MIN;median = std::max(b, A) / 1.0;}}return median;}double getMedian2(int A0, int A1, int B[], int n){int j = n / 2;double median(0);if ((n + 2) % 2 == 0){if (A0 >= B[j]){int b = (j + 1 < n) ? B[j + 1] : INT_MAX;median = (B[j] + std::min(b, A0)) / 2.0;}else if (A1 <= B[j - 1]){int b = (j - 2 >= 0) ? B[j - 2] : INT_MIN;median = (B[j - 1] + std::max(A1, b)) / 2.0;}else{median = (std::max(B[j - 1], A0) + std::min(B[j], A1)) / 2.0;}}else{if (A0 >= B[j]){int b = (j + 1 < n) ? B[j + 1] : INT_MAX;median = std::min(B[j + 1], A0);}else if (A1 <= B[j]){int b = (j - 1 >= 0) ? B[j - 1] : INT_MIN;median = std::max(b, A1);}elsemedian = B[j];}return median;}};


0 0