Arrays 在给定范围内查找最大数组元素的最佳方法
给定一个长度为Arrays 在给定范围内查找最大数组元素的最佳方法,arrays,algorithm,data-structures,time-complexity,Arrays,Algorithm,Data Structures,Time Complexity,给定一个长度为n和m查询的非负整数数组,该数组由两个整数a和b组成,期望在数组的索引[a,b]范围内找到最大值。请注意,a可以大于b,在这种情况下,所需的范围是从a到n,然后是从1到b。并且还给出了一个输入k,表示要考虑的范围的长度也是恒定的 例如: INPUT: 6 3 5 ---> n,m,k 7 6 2 6 1 5 ---> integer array 1 5 ---> query 1 2 6 ---> query 2 4 2 ---> query 3 OUT
n
和m
查询的非负整数数组,该数组由两个整数a
和b
组成,期望在数组的索引[a,b]
范围内找到最大值。请注意,a
可以大于b
,在这种情况下,所需的范围是从a
到n
,然后是从1
到b
。并且还给出了一个输入k
,表示要考虑的范围的长度也是恒定的
例如:
INPUT:
6 3 5 ---> n,m,k
7 6 2 6 1 5 ---> integer array
1 5 ---> query 1
2 6 ---> query 2
4 2 ---> query 3
OUTPUT:
7
6
7
我参考了这篇文章,但不知道如何处理
a>b
的情况。对于这个问题,有没有其他的方法, 我认为这可以用分而治之的方法来完成,所以让我们看看上面的例子。
所以对于a>b的情况
find max for range (1,b), say max_b = max_in_range(1,b).
find max for range (a,n), say max_a = max_in_range(a,n).
现在,您可以使用任何语言中的内置max方法轻松计算两个数字之间的max值
ans = max(max_a, max_b)
但是像这样涉及范围的问题,你可以使用段树来解决,这里是开始的链接-
希望这有帮助 滑动窗口方法: 要使用上述方法(即滑动窗口最大值)解决问题,只需将输入数组附加到其自身,如下所示: 76261572615 <> >代码> Ab/COD> >案例:考虑<代码> B= A+K。因此,您的新范围是
[a,a+k]
,您可以在不更改算法的情况下愉快地解决该问题
要稍微优化上述方法,只需先附加k
元素
如果您在每次查询到达时都滑过,则每个查询需要O(n)
k
非常接近或等于n
是最坏的情况
替代方法:如果查询量大且范围灵活,请使用以下方法 您正在寻找范围查询,这是最流行的查询 本教程查找给定范围内的最小值。我知道您要求的是最大值,这只是您必须在代码中进行的一个微不足道的更改 对于
a>b
案例,查询两次[1,b]
,然后查询[a,n]
,并报告两次中的最大值
预处理时间:O(n)
额外空间:O(n)
这种方法非常有效,因为它将回答O(logn)
中的每个查询,这在您查询过多的情况下非常有用
滑动窗口将输出所有范围内的最大元素,但您只需要给定范围内的最大元素。因此,与其使用滑动窗口方法,不如使用分段树或。您将感受到在一定范围内进行真正查询而不是滑倒的乐趣。(如果范围是灵活的,那么每次查询到达时滑动就不会缩放。)但是本文中提到的技术只计算大小为
k
的范围的最大值。但是[a,n]
和[1,b]
不是,因此计算不正确?啊,我实际上根本没有检查链接,让我用正确的数据结构更新我的答案,以便用于我的答案。请看一看。我还建议使用,因为范围的长度是恒定的(根据问题中的要求),您可以运行一个滑动窗口,以获得O(n)中所有可能范围的最大值,因此它的缩放肯定很好。@Dukeling:同意您的意见。让我们编辑语句以使其更有意义。谢谢我希望OP能做出一些回应,因为社区正在做出更多努力,使现有答案更有意义。