题解 | #数组中的逆序对#

数组中的逆序对

https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5

离散化+线段树+python

MOD = 1000000007

class SegmentTree:
    def __init__(self, size):
        self.n = size
        self.tree = [0] * (4 * size)
    
    def update(self, index, delta, node=1, left=1, right=None):
        if right is None:
            right = self.n
        
        # 找到叶子节点
        if left == right:
            self.tree[node] = (self.tree[node] + delta) % MOD
            return
        
        # 递归更新
        mid = (left + right) // 2
        if index <= mid:
            self.update(index, delta, 2 * node, left, mid)
        else:
            self.update(index, delta, 2 * node + 1, mid + 1, right)
        
        # 更新父节点
        self.tree[node] = (self.tree[2 * node] + self.tree[2 * node + 1]) % MOD
    
    def query(self, l, r, node=1, left=1, right=None):
        if right is None:
            right = self.n
        
        # 查询区间完全在节点区间外
        if r < left or l > right:
            return 0
        
        # 查询区间完全包含节点区间
        if l <= left and right <= r:
            return self.tree[node]
        
        # 递归查询左右子树
        mid = (left + right) // 2
        left_sum = self.query(l, r, 2 * node, left, mid)
        right_sum = self.query(l, r, 2 * node + 1, mid + 1, right)
        
        return (left_sum + right_sum) % MOD

class Solution:
    def InversePairs(self, data):
        if not data:
            return 0
        
        # 离散化处理
        sorted_data = sorted(data)
        mapping = {val: idx + 1 for idx, val in enumerate(sorted_data)}
        
        # 初始化线段树
        n = len(data)
        seg_tree = SegmentTree(n)
        
        # 逆序遍历数组
        count = 0
        for i in range(len(data) - 1, -1, -1):
            num = data[i]
            pos = mapping[num]
            
            # 查询比当前数小的元素个数(已经处理过的)
            if pos > 1:
                count = (count + seg_tree.query(1, pos - 1)) % MOD
            
            # 更新线段树
            seg_tree.update(pos, 1)
        
        return count % MOD
全部评论

相关推荐

07-04 17:40
惠州学院 Java
Lorn的意义:牛友你这所有项目怎么就这几个三四个技术,你这真得换项目了,找些好开源好项目迅速理解业务核心,让GPT给你写简历并把项目的业务方法告诉你 其实我建议你静下来沉淀会技术,然后包装段中厂实习再去投,你这样就算进去实习了也看懂好的技术文档啊,加油吧,不要太焦虑,选定一条就是干
投递牛客等公司10个岗位
点赞 评论 收藏
分享
07-13 21:50
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务