我理解您的问题的方式是您想对固定数组进行一些预处理,然后使您的 find max 操作非常快。
该答案描述了一种方法,该方法执行 O(nlogn) 预处理工作,然后对每个查询进行 O(1) 工作。
预处理 O(nlogn)
这个想法是准备两个二维数组 BIG[a,k] 和 SMALL[a,k] 其中
1. BIG[a,k] is the max of the 2^k elements starting at a
2. SMALL[a,k] is the min of the 2^k elements starting at a
您可以通过从 k==0 开始以递归方式计算此数组,然后通过将两个先前的元素组合在一起来为每个更高的元素建立值。
BIG[a,k] = max(BIG[a,k-1] , BIG[a+2^(k-1),k-1])
SMALL[a,k] = min(SMALL[a,k-1] , SMALL[a+2^(k-1),k-1])
每个查询查找 O(1)
然后,您可以通过组合 2 个预先准备好的答案立即找到任何范围的最大值和最小值。
假设您想找到从 100 到 133 的元素的最大值。您已经知道 32 个元素的最大值 100 到 131(在 BIG[100,5] 中)以及从 102 到 133 的 32 个元素的最大值(在 BIG[102 ,5]) 所以你可以找到其中最大的一个来得到答案。
相同的逻辑适用于最小值。您总是可以找到两个重叠的准备好的答案,它们将结合起来给出您需要的答案。