关于代替动态的向数组中插入数据有效的方式

今天遇到了一个题目感觉有点意思,我开始直接想着拿链表过掉的,发现链表无法完成这个题目,然后后边我又想着并查集可不可以,但是并查集好像也是复杂度有点高,后边一直在找优化的方式,怎么想感觉复杂度都会是在平方的级别,菜的要命。

问题抽象成的模型也是非常的简单,要求就是想数组中不断的插入数据,然后最后会问你每个数据的排名情况,当然这道题目直接 v e c t o r vector vector是不可以的,因为时间复杂度太高了,会被卡掉,想用链表?那我们就需要维护一个点的排名的逆向,而维护这个排名我们需要线性的时间复杂度,并查集怎么样呢?这也不行,假设我们进行路径压缩的优化,我们每次更新就需要花费线性的时间复杂度,我们就算不压缩路径我们还是需要造一个映射,维护这个映射需要线性,就算不是线性我们最好也不要这样做,因为麻烦。真正的做法其实也是用到了数据结构---- 树状数组,时间复杂度在 n ∗ l o g n 2 n * logn^ 2 nlogn2,这个时间复杂度在 1 0 5 10^5 105条件下是刚刚好,思路其实也是很简单的,首先我们制作一个排名数组,将数组的元素全部都置为一,然后我们逆向枚举每个点的排名,二分枚举排名利用前缀和来快速的看当前状态的排名的情况,当我们枚举完这个点的情况后,直接将该排名情况置为 零。

题目地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值