Guest User

Untitled

a guest
Oct 23rd, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.03 KB | None | 0 0
  1. public class MedianofTwoSortedArrays {
  2. /*
  3. This problem can be converted to the problem of finding kth element, k is (A's length + B' Length)/2.
  4. 该问题可以转换为寻找并判断两个sorted array中第k/2大的数。
  5. 如果总长度是奇数,求第(m+n)/2+1; 如果是偶数,求第(m+n)/2和(m+n)/2+1的平均数。
  6.  
  7. 我们需要判断A[k/2-1]和B[k/2-1]的大小。
  8. 如果A[k/2-1]==B[k/2-1],那么这个数就是两个数组中第k大的数。
  9. 如果A[k/2-1]<B[k/2-1], 那么说明A[0]到A[k/2-1]都不可能是第k大的数,所以需要舍弃这一半,继续从A[k/2]到A[A.length-1]继续找。当然,因为这里舍弃了A[0]到A[k/2-1]这k/2个数,那么第k大也就变成了,第k-k/2个大的数了。
  10. 如果 A[k/2-1]>B[k/2-1],就做之前对称的操作就好。
  11.  
  12. 边界条件,需要判断是否有一个数组长度为0,以及k==1时候的情况。
  13. */
  14. public double findMedianSortedArrays(int[] A, int[] B) {
  15. int m = A.length, n = B.length;
  16. int total = m+n;
  17. if(total%2 != 0){
  18. return (double) findKth(A, 0, m-1, B, 0, n-1, total/2+1);
  19. } else {
  20. double x = findKth(A, 0, m-1, B, 0, n-1, total/2);
  21. double y = findKth(A, 0, m-1, B, 0, n-1, total/2+1);
  22. return (double)(x+y)/2;
  23. }
  24. }
  25.  
  26. public int findKth(int[] A, int astart, int aend, int[] B, int bstart, int bend, int k) {
  27. int m = aend - astart + 1;
  28. int n = bend - bstart + 1;
  29. if (m > n)
  30. return findKth(B,bstart,bend,A,astart,aend,k);
  31. if(m==0)
  32. return B[k-1];
  33. if(k==1)
  34. return Math.min(A[astart],B[bstart]);
  35.  
  36. int partA = Math.min(k/2,m);
  37. int partB = k - partA;
  38. if(A[astart+partA-1] < B[bstart+partB-1])
  39. return findKth(A,astart+partA,aend,B,bstart,bend,k-partA);
  40. else if(A[astart+partA-1] > B[bstart+partB-1])
  41. return findKth(A,astart,aend,B,bstart+partB,bend,k-partB);
  42. else
  43. return A[astart+partA-1];
  44. }
  45. }
Add Comment
Please, Sign In to add comment