剑指 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 }
|