493.reverse-pairs.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. func reversePairs(nums []int) int {
  2. return mergeSort(nums, 0, len(nums)-1)
  3. }
  4. func mergeSort(nums []int, beg int, end int) int {
  5. if end <= beg {
  6. return 0
  7. }
  8. l, m := beg, beg+(end-beg)/2
  9. r, p, k := m+1, m+1, 0
  10. res := mergeSort(nums, beg, m) + mergeSort(nums, r, end)
  11. merge := make([]int, end-beg+1)
  12. for l <= m {
  13. for ; p <= end && 2*nums[p] < nums[l]; p++ {
  14. } // Advance l once each loop to calculate the cnt of reverse pairs
  15. res += p - m - 1
  16. for r <= end && nums[r] <= nums[l] {
  17. merge[k] = nums[r]
  18. k, r = k+1, r+1
  19. }
  20. merge[k] = nums[l]
  21. k, l = k+1, l+1
  22. }
  23. for r <= end {
  24. merge[k] = nums[r]
  25. k, r = k+1, r+1
  26. }
  27. copy(nums[beg:end+1], merge)
  28. return res
  29. }
  30. // ---------------------dividing line for TLE binary search algorithm---------------------
  31. type ints [][]int
  32. func (is ints) search(x int, beg int, end int) int {
  33. for beg <= end {
  34. mid := beg + (end-beg)/2
  35. if is[mid][0] < x {
  36. beg = mid + 1
  37. } else {
  38. end = mid - 1
  39. }
  40. }
  41. return beg
  42. }
  43. func (is *ints) insert(x int) int {
  44. beg, end := 0, len(*is)
  45. beg = is.search(2*x+1, beg, end-1)
  46. cnt := 0
  47. for i := beg; i < end; i++ {
  48. cnt += (*is)[i][1]
  49. }
  50. if beg == end {
  51. beg--
  52. }
  53. if x < 0 {
  54. beg = is.search(x, 0, end-1)
  55. } else {
  56. beg = is.search(x, 0, beg)
  57. }
  58. if beg == end {
  59. *is = append(*is, []int{x, 1})
  60. } else if (*is)[beg][0] == x {
  61. (*is)[beg][1]++
  62. } else {
  63. nis := make([][]int, end+1)
  64. copy(nis, (*is)[:beg])
  65. nis[beg] = []int{x, 1}
  66. copy(nis[beg+1:], (*is)[beg:])
  67. *is = nis
  68. }
  69. return cnt
  70. }
  71. func reversePairsTLE(nums []int) (cnt int) {
  72. var is ints = make([][]int, 0)
  73. for _, i := range nums {
  74. cnt += is.insert(i)
  75. }
  76. return
  77. }