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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)