Leetcode:Median of Two Sorted Arrays 两有序数组的中位数

戳我进传送门

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

Leetcode:Median of Two Sorted Arrays 两有序数组的中位数

如果 (m/2 + n/2) > k,那么意味着,当前中位数取高了,正确的中位数要么在 Section 1或者Section3中。

如果A[m/2] > B[n/2], 意味着中位数肯定不可能在Section 2里面,那么新的搜索可以丢弃这个区间段了。同理可以推断出余下三种情况,如下所示:

 

If (m/2+n/2+1) > k &&  a m/2   b n /2  , drop  Section  2
If (m/2+n/2+1) > k && a m/2   b n /2  , drop   Section  4
If  (m/2+n/2+1)  k && a m/2  >  b n /2 ,    drop  Section 3
If (m/2+n/2+1)  k && a m/2   b n /2  ,   drop  Section  1



简单的说,就是或者丢弃最大中位数的右区间,或者丢弃最小中位数的左区间。

注意:丢弃区间的时候一定得把中间那货一起甩掉,我在这个边界上错了好几次,挂了好几次

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

          }   

      }   

  }



};

 

你可能感兴趣的:(LeetCode)