LeetCode 翻转对
题目地址:https://leetcode.cn/problems/reverse-pairs/description/
给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
你需要返回给定数组中的重要翻转对的数量。
示例 1:
输入: [1,3,2,3,1]
输出: 2
示例 2:
输入: [2,4,3,5,1]
输出: 3
注意:
给定数组的长度不会超过50000。
输入数组中的所有数字都在32位整数的表示范围内。
// 给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
// 返回给定数组中的重要翻转对的数量// 实现思路:参考归并排序,先解决左边部分,再解决右边部分。最后考虑左跨右部分var help = make([]int, 50000) func reversePairs(nums []int) int {return divide(nums, 0, len(nums)-1)
}func divide(nums []int, l, r int) int {if l == r {return 0}m := (l + r) / 2return divide(nums, l, m) + divide(nums, m+1, r) + merge(nums, l, m, r)
}func merge(nums []int, l, m, r int) int {i := lj := m + 1count := 0sum := 0for i <= m {for j <= r && nums[i] > 2*nums[j] {count++j++}i++sum += count}// 归并排序a := lb := m + 1i = lfor a <= m && b <= r {if nums[a] <= nums[b] {help[i] = nums[a]i++a++} else {help[i] = nums[b]i++b++}}for a <= m {help[i] = nums[a]a++i++}for b <= r {help[i] = nums[b]b++i++}for i := l; i < r+1; i++ {nums[i] = help[i]}return sum
}