Leetcode 315. 计算右侧小于当前元素的个数

1.题目基本信息

1.1.题目描述

给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。

1.2.题目地址

https://leetcode.cn/problems/count-of-smaller-numbers-after-self/description

2.解题方法

2.1.解题思路

离散化+树状数组求前缀和

2.2.解题步骤

第一步,离散化。比如-1,2,6,6,8->0,1,2,2,3。首先将numsSet集合进行升序排序数组,然后遍历该数组,获取nums中每个数字的离散数值的映射map。然后遍历nums,将每个数字替换成离散值。

第二步,逆向遍历nums,并获取当前的nums[i]前面遍历的比nums[i]小的个数(即nums中索引比i大的且数值比nums[i]小的个数)。为了获取这个个数,这里可以用到树状数组,假设树状数组的原数组为a,则a[j]表示nums中已经遍历的各个数值b中,b==j的个数,则a数组的前缀和T[j-1]即为nums中已经遍历的数值中比j小的数值的个数,即为当前的result[i]的值。

3.解题代码

Python代码

# ==> 树状数组
class TreeArr():
    def __init__(self,length):
        self.length=length
        self.init()
    
    # 初始化树状数组
    def init(self):
        self.arr=[0]*self.length
    
    # 二进制从右向左第一个1和其右边的0组成的数字
    def lowerbit(self,x):
        return x&(-x)   # 计算机的负数采用的是补码(和取反加1效果一致)
    
    # 原数组a[index]增加val,更新树状数组
    def add(self,index,val):
        while index<self.length:
            self.arr[index]+=val
            index=index+self.lowerbit(index+1)
    
    # a[0]->a[index]项前缀和
    def query(self,index):
        sum_=0
        while index>=0:
            sum_+=self.arr[index]
            index-=self.lowerbit(index+1)
        return sum_

class Solution:
    def countSmaller(self, nums: List[int]) -> List[int]:
        length=len(nums)
        numsSet=set(nums)
        tree=TreeArr(len(numsSet))
        # 第一步,离散化。比如-1,2,6,6,8->0,1,2,2,3。首先将numsSet集合进行升序排序数组,然后遍历该数组,获取nums中每个数字的离散数值的映射map。然后遍历nums,将每个数字替换成离散值。
        discreteMap={}  # 离散值从0开始
        for i,num in enumerate(sorted(numsSet)):
            discreteMap[num]=i
        for i in range(length):
            nums[i]=discreteMap[nums[i]]
        # print(nums)
        # 第二步,逆向遍历nums,并获取当前的nums[i]前面遍历的比nums[i]小的个数(即nums中索引比i大的且数值比nums[i]小的个数)。为了获取这个个数,这里可以用到树状数组,假设树状数组的原数组为a,则a[j]表示nums中已经遍历的各个数值b中,b==j的个数,则a数组的前缀和T[j-1]即为nums中已经遍历的数值中比j小的数值的个数,即为当前的result[i]的值。
        result=[0]*length
        for i in range(length-1,-1,-1):
            result[i]=tree.query(nums[i]-1)
            tree.add(nums[i],1)
        return result

4.执行结果

在这里插入图片描述

posted @   Geek0070  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示