题目:
给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
你需要返回给定数组中的重要翻转对的数量。
算法:
方法一:归并排序
func reversePairs(nums []int) int {
// array := make([][]int, len(nums)
// for i := range nums {
// array[i] = [][]int{nums[i], i}
// }
return mergeSort(nums, 0, len(nums) - 1)
}
func mergeSort(nums []int, left, right int) int {
if left == right {
return 0
}
mid := (left + right) / 2
leftCnt := mergeSort(nums, left, mid)
rightCnt := mergeSort(nums, mid + 1, right)
count := 0
leftStart, rightStart := left, mid + 1
tmp := make([]int, 0)
for leftStart <= mid && rightStart <= right {
if nums[leftStart] > 2 * nums[rightStart] {
count = count + mid - leftStart + 1
rightStart ++
} else {
leftStart ++
}
}
leftStart, rightStart = left, mid + 1
for leftStart <= mid && rightStart <= right {
if nums[leftStart] > nums[rightStart] {
tmp = append(tmp, nums[rightStart])
rightStart ++
} else {
tmp = append(tmp, nums[leftStart])
leftStart ++
}
}
for leftStart <= mid {
tmp = append(tmp, nums[leftStart])
leftStart ++
}
for rightStart <= right {
tmp = append(tmp, nums[rightStart])
rightStart ++
}
for i := range(tmp) {
nums[left + i] = tmp[i]
}
return leftCnt + rightCnt + count
}
方法二:树状数组