4.go 1.8 KB

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