题目地址: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) / 2
return divide(nums, l, m) + divide(nums, m+1, r) + merge(nums, l, m, r)
}
func merge(nums []int, l, m, r int) int {
i := l
j := m + 1
count := 0
sum := 0
for i <= m {
for j <= r && nums[i] > 2*nums[j] {
count++
j++
}
i++
sum += count
}
// 归并排序
a := l
b := m + 1
i = l
for 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
}
LeetCode翻转对问题解析
1137

被折叠的 条评论
为什么被折叠?



