题目: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)).
看到题目,首先想到的是 把2个数组合并成一个,然后在去中间位置的数字。
后来发现时间复杂度为O(m+n);与题目不符合。
找了一些前辈的解题思路后自己模仿写了一个解法,并附上自己的理解。
代码:
public class Solution { public double findMedianSortedArrays(int A[], int B[]) { int m = A.length; int n = B.length; int total = m + n; if(total%2==1)//如果是奇数,返回中间total/2 ,至于为何加1,我感觉是为了防止越界。 { return findMed(A, m, B, n, total/2+1); } else //如果是偶数,返回中间2个的平均数 { return (findMed(A, m, B, n, total/2)+findMed(A, m, B, n, total/2+1))/2; } } public double findMed(int A[],int m,int B[],int n,int median) { if(m == 0)//如果是空,返回另一个的中位数 { return B[median-1]; } else if(n == 0) { return A[median-1]; } else if(median == 1)//如果是第1个,则取这2个数的最小的为中位数 { return Math.min(A[0],B[0]); } else if(m > n)//保证前面的是个数最小的数字 防止出现 A个数为2 B个数为8 median为8 median/2 大于2 数组会越界。 { return findMed(B, n, A, m, median); } int am = Math.min(m, median/2); int bm = median - am; if(A[am-1] < B[bm-1]) { return findMed(Arrays.copyOfRange(A, am, m), m-am, B, n, median-am); } else if(A[am-1]>B[bm-1]) { return findMed(A, m, Arrays.copyOfRange(B, bm, n), n-bm, median-bm); } else return A[am-1]; } }
这个时候可以用n+ (m-n)/2,前提m>n来避免这种问题出现。
虽说是个不起眼的小技巧,不过以前还真没注意到。