493.翻转对

50 阅读1分钟

题目:
给定一个数组 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
}

方法二:树状数组