在给定范围内查找最大数组元素的最佳方法

时间:2017-05-16 17:48:05

标签: arrays algorithm data-structures time-complexity

给定由两个整数nm组成的长度为ab的非负整数数组,预计会在该范围内找到最大值数组的索引[a,b]请注意,a可能大于b,在这种情况下,所需的范围是an,然后是1b 。并且还给出了输入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的案例。有没有其他方法解决这个问题

2 个答案:

答案 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

希望这有帮助!