树状数组-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
posted @ 2022-07-05 23:04  hyserendipity  阅读(32)  评论(0编辑  收藏  举报