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