剑指 Offer 51. 数组中的逆序对
https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
「归并排序」与「逆序对」是息息相关的。使用归并排序,每当遇到 左子数组当前元素 > 右子数组当前元素 时,意味着 「左子数组当前元素 至 末尾元素」 与 「右子数组当前元素」 构成了若干 「逆序对」 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
   | var tmp []int  
  func reversePairs(nums []int) int {     tmp = make([]int, len(nums))     copy(tmp, nums)     return mergeSort(nums, 0, len(nums) - 1) }
  func mergeSort(nums []int, left, right int) int {     if left >= right {         return 0     }          mid := (left + right) / 2     res := mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right)
      i, j := left, mid + 1
           for k := left; k <= right; k++ {         tmp[k] = nums[k]     }
           for k := left; k <= right; k++ {         if i == mid + 1 {                            nums[k] = tmp[j]             j++         } else if j == right + 1 || tmp[i] <= tmp[j] {                          nums[k] = tmp[i]             i++         } else {                          nums[k] = tmp[j]             j++
              res += mid - i + 1           }     }     return res }
 
  |