4.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package main
  2. // len(nums1) + len(nums2) != 0
  3. func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
  4. // Use i, j to divide A, B into 2 parts, like
  5. // [A(0), ... , A(i-1), | A(i), ... , A(m)] and
  6. // [B(0), ... , B(j-1), | B(j), ... , B(n)],
  7. // then the left part of A and B is left, the right
  8. // part is right, when max(left) <= min(right) &&
  9. // len(left) == len(right), we can find the median by
  10. // median = [max(left) + min(right)] / 2
  11. m, n := len(nums1), len(nums2)
  12. // if m < n, i ~ [0, m], j = (m+n+1)/2 - i
  13. if m > n { // if m > n, swap nums1, nums2
  14. nums1, nums2, m, n = nums2, nums1, n, m
  15. }
  16. ibeg, iend, halfLen := 0, m, (m+n+1)/2
  17. var i, j int
  18. for ibeg <= iend {
  19. i = (ibeg + iend) / 2
  20. j = halfLen - i
  21. if i > 0 && nums1[i-1] > nums2[j] { // A[i-1]'s too big, ie. i's too big
  22. iend = i - 1
  23. } else if i < m && nums2[j-1] > nums1[i] { // i's too small
  24. ibeg = i + 1
  25. } else {
  26. // i, j is found (A[i-1] <= B[j] && B[j-1] <= A[i])
  27. var maxOfLeft, minOfRight int
  28. if i == 0 { // find max of left
  29. maxOfLeft = nums2[j-1]
  30. } else if j == 0 {
  31. maxOfLeft = nums1[i-1]
  32. } else {
  33. maxOfLeft = nums1[i-1]
  34. if nums2[j-1] > maxOfLeft {
  35. maxOfLeft = nums2[j-1]
  36. }
  37. }
  38. if (m+n)%2 != 0 { // if odd, return max of left as median (!!!)
  39. return float64(maxOfLeft)
  40. }
  41. if i == m { // find min of right
  42. minOfRight = nums2[j]
  43. } else if j == n {
  44. minOfRight = nums1[i]
  45. } else {
  46. minOfRight = nums1[i]
  47. if nums2[j] < nums1[i] {
  48. minOfRight = nums2[j]
  49. }
  50. }
  51. return float64(maxOfLeft+minOfRight) / 2
  52. }
  53. }
  54. return -1 // not found, useless
  55. }
  56. // func main() {
  57. // nums1 := []int{1, 3}
  58. // nums2 := []int{2}
  59. // fmt.Println(findMedianSortedArrays(nums1, nums2))
  60. // nums3 := []int{}
  61. // nums4 := []int{1}
  62. // fmt.Println(findMedianSortedArrays(nums3, nums4))
  63. // }