我们获得了一个数组和一些查询。每个查询都包含两个数字i
和j
。我们需要从索引i
开始并在给定数组中的索引j
处找到子数组中的最大(或最小)元素。
对于例如。
arr = [2 , 3 , 5, 8 , 4 , 9]
和
query 1: (2 , 4)
与此查询对应的子数组将为[5 , 8 , 4]
。因此,最大值为8
。
注意:查询数量约为10 ^ 5,数组中大约有10 ^ 6个元素。此外,执行程序的时间限制为1秒。所以,我想需要一个解决方案,每个查询的复杂度为O(log n)或更低,其中n是数组中元素的数量。
答案 0 :(得分:0)
counter = i-1
max = MIN_INTEGER
min = MAX_INTEGER
while counter < j:
if arr[counter] > max:
max = arr[counter]
if arr[counter] < min:
min = arr[counter]
counter++
return max,min
编辑:
或者,将其插入maxheap和minheap(O(n)),然后查询全部为O(1)。
答案 1 :(得分:0)
可以使用STL:max_element
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
std::vector<int> v{2,3,5,8,4,9};
int initial , end;
cin>>initial>>end;
cout <<*(std::max_element(v.begin()+initial,v.begin()+end));
return 0;
}
其他方式仅适用于c ++ 17
http://coliru.stacked-crooked.com/view?id=3de476681d9e1374
#include <iostream>
#include <algorithm>
#include <experimental/array>
using namespace std;
int main()
{
decltype(auto) v = std::experimental::make_array(2,3,5,8,4,9);
int initial=2,end=4;
cout <<*(std::max_element(v.begin()+initial,v.begin()+end));
return 0;
}
答案 2 :(得分:0)
详细说明Yeldar的RSQ想法,并假设您只需要找到最大值(否则,也可以为最小值重复此结构): - 您已经拥有每个条目的价值。现在将数组分成对,并存储每对的最大值。 (所以在你的例子中你得到3,8,9)。然后将它们分成两对(4个原始条目)并存储其中的最大值(因此8,9;奇数一个单独保留)。重复直到你完成一对,给出整个阵列的最大值。因此,您有一个树的多个级别,每个级别对应一个子阵列。
- 现在,您可以使用此树更有效地查找每个最大值:如果需要找到从i到j的最大值,请在树中找到完全包含从i到j的范围的最小子阵列。现在你可以看到(从你的树上)该子阵列的最大值,因此追踪它(因为每个更高级别的子阵列由两个较低级别的子阵列组成),直到你得到完全包含在从i到i的范围内的东西j,或完全不相交。在您追踪时,记录您不能走的每条路径的最大值。
如果它完全包含,你有答案(该范围的最大值)。如果它完全不相交,那么它不是你的答案(它来自不在范围内的东西),所以从你没有采取的路径中取出最高的最大值并重复该过程(添加在任何新的未通过的路径中),直到你的最大值最终来自完全包含在该范围内的子阵列。
答案 3 :(得分:0)
您可以尝试通过遍历所有元素来存储初始输入的最大值和最小值,如果i和j包含上一个输入,则可以尝试存储下一个输入,那么您可以使用之前的结果来节省时间。
答案 4 :(得分:0)
你可以使用C ++ STL(这是对前面提到的解决方案的修改。我们需要在结尾添加+1。因为它在[start,end]范围内需要索引。希望这可以帮助。尝试这个问题以便更好地理解。 https://www.hackerrank.com/challenges/service-lane/problem
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> arr{2,3,5,8,4,9};
int i; // start index
int j; // end index
cin >> i >> j;
cout << *max_element(arr.begin()+i, arr.begin()+j+1);
return 0;
}