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

Posted

技术标签:

【中文标题】如何在排序数组中查找第一次出现最大值的索引【英文标题】:How to find index in sorted array where occurs maximum value for the first time 【发布时间】:2015-12-03 15:11:29 【问题描述】:

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

我们以这个数组为例:

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,原生解决方案就是迭代它。但我想有可能找到更有效的解决方案。你建议什么算法?

【问题讨论】:

为什么会同时标记为java 和c++? 只是为了澄清一下,您是要获取 201 首次出现的数组的索引还是 201 出现的总次数?您的声明Let's say that 201 occurs 200 times in this array. So the answer is that the index equals 200. 使这一点不清楚。 【参考方案1】:

二分搜索是O(log n),它比复杂度为O(n) 的简单方法要好。在 C++ 中,您将使用 std::lower_bound

【讨论】:

在 Java 中,简单的 Collections.binarySearch 似乎可以工作...... std::distance(v.begin(), std::lower_bound(v.begin(), v.end(), v.back()));.【参考方案2】:

使用二分搜索。

本机二进制搜索将返回任何一次出现的键。它的“查找”标准是:

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

在您的“查找”条件为:

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

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

【讨论】:

【参考方案3】:

您可以使用标头&lt;algorithm&gt;中声明的标准算法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 ) ) ) );

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

错误的解决方案。比如说,我的数组是:a[100] = 1,2,2,2,2,2....2。那么 ans 是:索引 1,从末尾开始迭代 99 次。

以上是关于如何在排序数组中查找第一次出现最大值的索引的主要内容,如果未能解决你的问题,请参考以下文章

数组冒泡排序选择排序二分查找法

在特定元素上查找排序数组的范围索引

数组的高级(排序和查找)

数组高级部分--排序,查找

C#查找最高数组值和索引

java12-6 冒泡排序法和选择排序法