LeetCode 100258 - 最高频率的 ID

题目链接:https://leetcode.cn/contest/weekly-contest-390/problems/most-frequent-ids/

题目大意:一开始给一个空的集合,每次操作往集合中加入value[i]个值为key[i]的元素,或者删除value[i]个值为key[i]的元素,问每一次操作之后集合的最大值。

题解:这个很明显是个数据结构的题目,各种什么线段树平衡树或者拿个map搞一搞都可以做。但是我想了想是不是有不用任何数据结构的做法呢?

由于值域有限(其实无限也无所谓),考虑记录每一个值为key的元素在第i次操作之后出现的频次变化为了freq。记录为四元组 {freq, key, i, nexti}。其中nexti表示下一次修改key元素的操作位于nexti(缺省为q + 1),也就是说freq影响的范围就是[i, nexti - 1]

按freq排序然后反序(freq最大的先处理),然后每次操作就是把[i, nexti-1]的答案,如果为空,则全部赋值为key。这是一个典型的区间赋值的问题。

对于区间赋值的问题,可以用扫描的方法,在进入i区间的时候标记当前为freq,在退出nexti-1位置的时候把当前的freq删除。

很可惜由于这个是动态维护最大值的问题,没办法避免使用复杂数据结构。

但是想一下,这个并不是真正的区间赋值,他 只对空的位置赋值。那意味着只需要每次找到下一个空位置即可。可以用链表或者并查集来维护。

至此不需要用复杂度为log的数据结构。但是不可避免的在一开始使用sort。但实际上不失为一种好办法,因为sort的常数极小。

posted @ 2024-03-24 12:38  purinliang  阅读(16)  评论(0编辑  收藏  举报