树状数组-493. 翻转对
问题描述
给定一个数组 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位整数的表示范围内。
问题求解
离散化 + 计频
from sortedcontainers import SortedSet
class Solution:
def reversePairs(self, nums: List[int]) -> int:
n = len(nums)
sort = SortedSet()
for num in nums:
sort.add(num)
sort.add(num / 2)
record = {}
rank = 1
for num in sort:
record[num] = rank
rank += 1
bit = [0] * (len(record) + 1)
def update(idx, delta):
while idx < len(bit):
bit[idx] += delta
idx += (idx & -idx)
def query(idx):
res = 0
while idx:
res += bit[idx]
idx -= (idx & -idx)
return res
res = 0
for i in range(n - 1, -1, -1):
res += query(record[nums[i] / 2] - 1)
update(record[nums[i]], 1)
return res