Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在给定范围内查找最大数组元素的最佳方法_Arrays_Algorithm_Data Structures_Time Complexity - Fatal编程技术网

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能做出一些回应,因为社区正在做出更多努力,使现有答案更有意义。