如何在log(n)时间内在数组的任何范围内找到最大值?

时间:2012-02-27 15:05:17

标签: c++ algorithm binary-search-tree indexed

E.g。数组:{1,5,2,3,2,10}

范围:0-1答案:5 范围:2-4答案:3 范围:0-5答案:10 等

4 个答案:

答案 0 :(得分:11)

如果数组没有排序,则无法按照您的要求进行操作。

要找到最大值,您至少需要检查范围内的所有元素,这需要O( n )。

如果您允许对数据进行某种形式的预处理,则很容易。您可以使用答案构建一个n 2 查找表。然后你可以在恒定时间内找到任何范围的最大值。

答案 1 :(得分:4)

这是不可能的。你必须访问每个元素。

如果您的数组是先验地排序的,那么它是O(1)操作。

答案 2 :(得分:1)

答案 3 :(得分:0)

@Daniel Talamas如果我理解正确,你想要这个:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int maxlement(int range1,int range2) {
std::vector<int> v{ 1, 5, 2, 3, 2, 10 };
std::vector<int>::iterator result;

result = std::max_element(v.begin()+range1, v.begin()+range2+1);
int dist = std::distance(v.begin(), result);
return v[dist];

}
int main() {
int range1,range2;
cout<<"From ";
cin>>range1;
cout<<"To ";
cin>>range2;
cout<<"Max Element Is "<<maxlement(range1,range2);
return 0;
}