K-ordered块范围查询

时间:2017-04-09 05:21:50

标签: algorithm segment-tree

给定一个N个数字列表(1个索引),如果连续块具有多于K个连续出现的相同元素,则它是K有序块。

示例:[2,4,4,5,5,5,3,3]具有从索引4到6的3顺序块和从7到6的2顺序块8. 4到6的块也是2阶块。

现在,如果给出形式查询: LeftIndex,RightIndex,Order-K

我们需要告诉LeftIndex和RightIndex存在多少Order-K块。

如果查询类型为2,8,2,则回答为3,因为3个块与订单2相同。它们从索引2到3,4到6,7到8。

如果查询最多为100000,如何解决此问题,列表可以是100000。

1 个答案:

答案 0 :(得分:0)

你应该展示你所做的和你的想法。请参阅tour

  

包含有关您尝试过的内容以及您尝试执行的操作的详细信息。

算法非常简单。

使用i = leftIdx - 1开始循环,跳过并计算所有等于list[i]的下一个元素(使用while()循环)。如果相同元素的数量(包括list[i])大于或等于K,则会找到新的Order-K块。现在将i更新为i+count,然后继续循环直到i > rightIdx

请注意角落案例(空列表,rightIdx< = leftIdx等)和IndexOutOfBound例外。