题目:
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)).
题目的意思就是给定两个有序数组,长度分别为m和n,然后取出这两个数组合并后的中位数(注意:合并后的数组有序排列),同时要求时间复杂度为O(log (m+n))。
解决这一题我们首先按照以下思路进行:
(1)明白什么是中位数?
(2)掌握如何在O(log (m+n))的时间复杂度之下合并这两个有序数组。
针对第一个问题,我举例说明:
int []A = {1, 2, 3 ,4 ,5 ,6};
对于上面的序列,其中位数为:(double)(3+4)/2 = 3.5
而对于:
int []A = {1, 2, 3}这个序列的中位数为:2
这就是说明了,如果序列的长度为奇数,那么中位数=A[A.length/2] 如果序列长度为偶数,中位数为=(double)(A[A.length/2-1]+A[A.length/2])/2
针对第二个问题,我们可以利用归并排序中的合并操作进行解决。
啥也不说了,直接上代码:
1 public class Solution { 2 public double findMedianSortedArrays(int A[], int B[]) { 3 /* 4 该判断就是当A数组为空的时候,我们的中位数就从B数组中取得,根据 5 上面我提到的如何对一组数取中位数的方法,下面的也不难理解 6 */ 7 if(A.length == 0 && B.length != 0) 8 { 9 if(B.length % 2 == 0) 10 { 11 return (double)(B[(B.length/2)-1]+B[B.length/2])/2; 12 }else 13 { 14 return B[B.length/2]; 15 } 16 } 17 /*和上一个判断比较类似*/ 18 if(B.length == 0 && A.length != 0) 19 { 20 if(A.length %2 == 0) 21 { 22 return (double)(A[A.length/2-1]+A[A.length/2])/2; 23 }else 24 { 25 return A[A.length/2]; 26 } 27 } 28 /* 29 如果两个数组都为空,说明此时无法取得中位数,那么返回为零, 30 (其实我感觉LeetCode里面好多题都好怪,没办法,以通过为主) 31 */ 32 if(A.length == 0 && B.length == 0) 33 { 34 return 0.0; 35 } 36 /* 37 下面的就很好理解了就是数组之间的归并操作,这里就不解释了 38 */ 39 int m = A.length; 40 int n = B.length; 41 int []temp = new int[m+n]; 42 int i = 0; 43 int j = 0; 44 int k = 0; 45 double mid = 0; 46 if(A[0] >= B[0]) 47 { 48 temp[i++] = B[k++]; 49 }else 50 { 51 temp[i++] = A[j++]; 52 } 53 while(j <= m-1 && k <= n-1) 54 { 55 if(A[j] >= B[k]) 56 { 57 temp[i++] = B[k++]; 58 }else 59 { 60 temp[i++] = A[j++]; 61 } 62 } 63 while(j <= m-1) 64 { 65 temp[i++] = A[j++]; 66 } 67 while(k <= n-1) 68 { 69 temp[i++] = B[k++]; 70 } 71 72 73 74 /* 75 在进行完数组之间的归并操作之后,我们就要开始进行去中位数了,这里我分两种情况进行讨论,其实 76 和上面的if判断语句中的操作比较类似,这里就不多讲了。 77 */ 78 if((m+n)%2 == 0) 79 { 80 mid = (double)(temp[(m+n)/2]+temp[(m+n)/2-1])/2; 81 }else 82 { 83 mid = temp[(m+n-1)/2]; 84 } 85 /*在进行完上述操作之后,我们就将这个值返回即可*/ 86 return mid; 87 } 88 }
其实这道题并不难,只要我们解决了上面提到的两个问题,就很好解决了。如果有更好的方法,欢迎联系我,邮箱:cmhhw_xju@163.com QQ:764666877