如何在给定数组中的任何子阵列(任何大小)中找到最大值(或最小值)?

时间:2017-07-28 03:24:00

标签: c++ arrays algorithm

我们获得了一个数组和一些查询。每个查询都包含两个数字ij。我们需要从索引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是数组中元素的数量。

5 个答案:

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