我正在阅读算法第3版的介绍,我遇到了以下内容:假设我们在0到k的范围内给出n个整数,我们想知道这些整数中有多少是在[a,b]范围内对于给定的整数a和b。它具有粗暴的解决方案,但随后它表示通过输入的预处理阶段,该查询可以在Θ(1)时间内完成,并且该预处理阶段需要O(n + k)时间。我正在考虑对整数进行排序,但排序至少需要O(nlogn)时间,超过O(n + k)。可以为预处理阶段做些什么?感谢
答案 0 :(得分:5)
由于数字在[0,k]范围内,您可以使用计数排序在O(n + k)时间内对它们进行排序。
获得计数后,您可以获取该计数数组的前缀和,它将告诉您[0,a]范围内的数字数。 O(k)时间。
使用它可以在O(1)时间内通过采取适当的差异来回答[a,b]的查询。