给出一个数组,例如
[69,20,59,35,10]
我想发现此阵列中的所有峰。根据问题的定义,峰是满足属性p_k 我必须使用哪种算法或方法来处理此问题?[20,59,35]
[20,59,10]
[20,35,10]
答案 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个元素的峰。