【发布时间】:2018-01-03 23:37:09
【问题描述】:
我们得到一个数组和一些查询。每个查询包含两个数字i 和j。我们需要在给定数组中从索引i 开始到索引j 结束的子数组中找到最大(或最小)元素。
例如。
arr = [2 , 3 , 5, 8 , 4 , 9]
和
query 1: (2 , 4)
与此查询对应的子数组将是[5 , 8 , 4]。因此,最大值为8。
注意:查询数约为 10^5,数组中约有 10^6 个元素。程序执行的时间限制也是 1s 。所以,我猜需要一个解决方案,每个查询的复杂度为 O(log n) 或更小,其中 n 是数组中的元素数。
【问题讨论】:
-
简单方法: 从
i到j线性迭代并找到最大值或最小值。 更好的方法: 建立一个RSQ。这一切都取决于数组中的项目总数、查询的数量和复杂性。 -
谢谢@yeldar。数组中将有大约 10^6 个元素和大约 10^5 个查询。程序应在 1 秒内给出结果。所以我认为这种简单的方法不会被证明是有用的。如果您详细说明第二种方式,那将非常有帮助。
-
据我记忆中的 ACM 经验,10^6 听起来与 RSQ 限制完全一样。随便找求和段树,网上应该有解决办法。您使用什么语言?
-
@yeldar 我使用 C++
-
看看这个...RMQ topcoder tutorial