如何在排序数组中找到第一次出现最大值的索引?
让我们以此数组为例:
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
,本机解决方案就是迭代它。但我想有可能找到更有效的解决方案。您建议使用什么算法?
答案 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
}