如何在排序数组中找到第一次出现最大值的索引

时间:2015-12-03 15:11:29

标签: java c++ algorithm max

如何在排序数组中找到第一次出现最大值的索引?

让我们以此数组为例:

1 2 3 4 5 6 7 8 9 ... 200 201 201 201 201 201 201 201 201 201 201 201 201 ...201

其中201是最大值。

让我们说201在这个数组中出现200次。所以答案是指数等于200。

只要我们得到!=201,本机解决方案就是迭代它。但我想有可能找到更有效的解决方案。您建议使用什么算法?

4 个答案:

答案 0 :(得分:2)

二进制搜索是O(log n),这比您的天真方法更好,其复杂度为O(n)。在c ++中,您使用std::lower_bound

答案 1 :(得分:1)

使用二进制搜索。

原生二进制搜索将返回您的密钥的任何一次出现。它的“发现”标准是:

if(a[mid]==key)
    return mid;

制作二元搜索功能,其中“查找”条件为:

if(a[mid]==key && a[mid-1]<key)
    return mid;

此外,如果它是一个简单的数组,您可以使用c ++标准模板库(STL)函数lower_bound

答案 2 :(得分:1)

您可以使用标头std::lower_bound

中声明的标准算法<algorithm>

例如

#include <algorithm>
#include <iterator>

//...    

size_t n = std::distance( std::begin( a ), 
                          std::lower_bound( std::begin( a ), 
                                            std::end( a ), 
                                            *std::prev( std::end( a ) ) ) );

其中a是已排序数组的名称。

答案 3 :(得分:0)

从数组的末尾迭代,而不是从头开始。第一次出现的最大值可能比结束时更接近结束。

for (int i = array.length; i >=0; i--) {
     do stuff
}