这种难题的核心是分块,线段树(线段树维护的方法是区间块递归处理跟构建BST有点相似,线段树还可以每个块之间又分块,甚至线段树的节点可以嵌套树,队列,链表,红黑树,由场景决定),然后随机取样(随机取样并不是概率的大小来过滤,),竞赛可以作弊的地方是可以先把一些线段树的结构的通用模版决定。构建线段树的构建时间复杂度通常O(NlogN),该题查询区间是要结合二分,如果这种题用线段树构建并不是最优解。
重点说明下,谁有时间可以转换为带时间刻度的类似钟表套钟表的数据结构的。理想时间复杂度是O(N),我认为比构建线状树的作用更牛,思路如下。
把钟表等分为360/去重数组的长度,数组去重后的长度即看做概率在[head,tail]被采样的理想因子是1(代表100%100),用cycle数据结构钟表来采样描述样本,可以等价理解为,一个样本数据在某个查询孤独的概率,每个数字未出现的概率和出现的概率都是线性公平的,此数据结构要结合摩尔投票,盲投构建速度更快,用概率值计算区间,或者换个词,分布率(分布情况)来体现在钟表上。根据查询区间定位到某个狐度。查询一次的时间复杂度是0(1);核心是需要奖所在范围的样本打下最大计数器刻度。我认为理想的构建加上hash和前缀后缀的过滤器是符合O(N)构建的。
注:此题的子问题是是区间贪心找出现最大的重复数字次数,所以也可以将线段树构建为前缀连续合理差值(窗口向右/左滑动会导致样本数字的总体出现次数减少)
综上所述,该题查询速度可以是O(1),构建速度是在(O(N²),O(N×logN),O(N)+logN,极限是O(N)+<logN),我认为取决于构建速度
有人给我200块-1000
我有信心做到,因为很多场景的确有这样的频繁区间查询
贴一段汪乐平大佬的解法