Median of Two Sorted Array

利用分治算法的Merge算法,算法的复杂度应该是merge算法的一半,虽然leetcode显示Accepted,但是时间复杂度应该没有满足。时间复杂度为:O((n+m)/2)

 1 class Solution {
 2 public:
 3     double findMedianSortedArrays(int A[], int m, int B[], int n) {
 4         int a=0,b=0,temp=0;
 5         if((m+n)%2==1)
 6         {
 7             while((a+b)<=(m+n-1)/2)
 8             {
 9                 if((A[a]<=B[b]&&a<m)||b>=n)
10                 {
11                     temp=A[a];
12                     a++;
13                 }
14                 else
15                 {
16                     temp=B[b];
17                     b++;
18                 }
19             }
20             return temp;
21         }
22         else
23         {
24              int temp1=0, temp2=0;
25              while((a+b)<=(m+n)/2)
26             {
27                 if((a<m&&A[a]<=B[b])||b>=n)
28                 {
29                     temp2=A[a];
30                     if((a+b)==(m+n-2)/2)
31                         temp1=temp2;
32                     a++;
33                 }
34                 else
35                 {
36                     temp2=B[b];
37                     if((a+b)==(m+n-2)/2)
38                         temp1=temp2;
39                     b++;
40                 }
41                 
42             }
43             return (double)(temp1+temp2)/2;
44         }
45     }
46 };

以下算法是网上看到的,时间复杂度为O(nlog2(n))

 1 class Solution {
 2 public:
 3     double findMedianSortedArrays(int A[], int m, int B[], int n) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function
 6         int *a=new int[m+n];
 7         
 8         memcpy(a,A,sizeof(int)*m);
 9         memcpy(a+m,B,sizeof(int)*n);
10         
11         sort(a,a+n+m);
12         
13         double median=(double) ((n+m)%2? a[(n+m)>>1]:(a[(n+m-1)>>1]+a[(n+m)>>1])/2.0);
14         
15         delete a;
16         
17         return median;
18     }
19 };

网上说的最好的算法,O(log(m+n))

 1 class Solution {
 2 public:
 3     double findKth(int A[], int m, int B[], int n, int k)
 4     {
 5         //m is equal or smaller than n
 6         if (m > n)
 7             return findKth(B, n, A, m, k);
 8         if (m == 0)
 9             return B[k-1];
10         if (k <= 1)
11             return min(A[0], B[0]);
12 
13         int pa = min(k / 2, m), pb = k - pa;
14         if (A[pa-1] < B[pb-1])
15         {
16             return findKth(A + pa, m - pa, B, n, k - pa);
17         }
18         else if(A[pa-1] > B[pb-1])
19         {
20             return findKth(A, m, B + pb, n - pb, k - pb);
21         } else
22             return A[pa-1];
23     }
24 
25     double findMedianSortedArrays(int A[], int m, int B[], int n) {
26         // Start typing your C/C++ solution below
27         // DO NOT write int main() function
28         int k = m + n;
29         if (k & 0x1)
30         {
31             return findKth(A, m, B, n, k / 2 + 1);
32         } else
33         {
34             return (findKth(A, m, B, n, k / 2) + findKth(A, m, B, n, k / 2 + 1)) / 2;
35         }
36     }
37 };

 

posted @ 2014-04-12 11:14  jonathan321  阅读(206)  评论(0)    收藏  举报