给定由两个整数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
我提到this文章,但我无法了解如何处理a>b
的案例。有没有其他方法解决这个问题
答案 0 :(得分:1)
滑动窗口方法:
要使用提到的方法解决问题,即Sliding Window Maximum,只需将输入数组附加到自身,如下所示:
7 6 2 6 1 5 7 6 2 6 1 5
正常a<=b
案例工作。
a>b
案例:考虑b = a + k
。因此,您的新范围为[a,a+k]
,无需对算法进行任何更改即可轻松解决。
为了优化上述方法,您可以只追加第一个k
元素。
如果每次查询到达时滑动,则每次查询需要O(n)
。 k
非常接近或等于n
是最糟糕的情况。
替代方法:重度查询和灵活范围时,请使用以下方法。
您正在寻找范围查询,这是Segment Trees最受欢迎的内容。
This教程找到给定范围内的最小值。我知道你已经要求最大化,这只是你必须在代码中做出的微不足道的改变。
对于a>b
个案,请[1,b]
&amp;然后是[a,n]
并报告两者中的最大值。
预处理时间:O(n)
额外空间:O(n)
这种方法非常有效,因为它会回答 O(logn)
中的每个查询,这对您查询过多非常有帮助。
滑动窗口将输出所有范围中的最大元素,但是您只需要在给定范围内的最大元素。因此,不要使用Sliding Window方法,而是使用Segment Trees或Binary Indexed Trees。你会感受到真正在一个范围内查询而不是滑过的乐趣。 (只要每次查询到达时滑动,如果范围灵活,都不会缩放。)
答案 1 :(得分:-2)
我认为这可以通过使用分而治之的方法来完成,所以让我们来看看上面的例子。
因此,对于案例a&gt; 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).
现在,您可以使用任何语言的in built max方法轻松占用两个数字之间的最大值
ans = max(max_a, max_b)
但像involes范围这样的问题,你可以使用分段树解决它,这里是开始的链接 - https://en.wikipedia.org/wiki/Segment_tree
希望这有帮助!