如何在首次出现最大值的排序数组中查找索引

How to find index in sorted array where occurs maximum value for the first time

本文关键字:排序 数组 索引 查找 最大值      更新时间:2023-10-16

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

让我们以这个数组为例:

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

其中CCD_ 1是最大值。

假设201在这个数组中出现了200次。所以答案是指数等于200。

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

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

使用二进制搜索。

本机二进制搜索将返回任何一个出现的密钥。其"查找"标准是:

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

制作一个二进制搜索函数,其中您的"查找"标准是:

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

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

您可以使用标头<algorithm> 中声明的标准算法std::lower_bound

例如

#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 ) ) ) );

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

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

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