如何在阵列中找到峰?

时间:2019-09-02 16:44:31

标签: algorithm

给出一个数组,例如

[69,20,59,35,10]

我想发现此阵列中的所有峰。根据问题的定义,峰是满足属性p_k p_j且k

[20,59,35]

[20,59,10]

[20,35,10]

我必须使用哪种算法或方法来处理此问题?

2 个答案:

答案 0 :(得分:1)

假设您的数组的索引为0,则可以使用以下算法:

.netstandard 2.0

答案 1 :(得分:1)

如评论中所述,最坏情况下的峰总数约为O(n^3),因此输出所有峰的最佳算法不能优于O(n^3)-并且其他答案提供了三次时间实现。具有此峰值顺序的输入示例为00...011...100..0,其中三个相同字符的段中的每个段的长度相等。

但是,假设您有兴趣计算峰值数量而不是输出每个峰值,那么可以找到一种更快的O(n logn)解决方案。您可以实现一个BST(二分搜索树),它支持对数时间的计算等级(即,每个节点都知道左边有多少个节点,也就是下面有多少个值)。创建两个BST-一个将元素存储在当前wannabe峰的左侧,另一个将其存储在其右侧。对于从1到n-1的每个i,假设它是中间的,并找出可以使用多少对索引。第一个BST中比第i个元素低的每个值都可以是左索引,而第二个BST中第i个元素以下的每个值都可以是右索引。因此,这些计数的乘积就是中间存在第i个元素的峰。