假设我有一个0注:我把这个问题(已经改了很多次)编辑成一个可以合理回答的问题。我删除了早期版本中出现的奇怪的结束条件,因为这个版本更简单,但没有失去通用性。

最佳答案

首先,我们需要考虑如何定义局部最小值:

a[i] < a[i-1] and a[i] < a[i+1]

从这个条件中,我们可以看到,如果我们将数组绘制在x/y图上(x=索引,y=值),那么局部最小值将位于山谷处。因此,为了保证存在局部极小值,必须保证坡度符号的变化(从递减到增加)。
如果知道某个范围的端点坡度行为,则知道该范围内是否存在局部最小值。此外,数组必须具有从[0]到[1]的行为递减斜率符号和从[n-1]到[n]的行为递增斜率符号,否则问题很小。考虑:
a = [1,2,3,4,5] (increasing, increasing) a[0] is an LM
a = [5,4,3,2,1] (decreasing, decreasing) a[n] is an LM
a = [1,2,2,2,1] (increasing, decreasing) a[0] and a[n] are LMs

我认为这对你完成这个方法应该是足够的启发。
请注意,扩展此方法仅适用于唯一的值,例如所有1的数组,除非您执行某些边缘情况检测,否则它不会有O(log n)运行时间。

07-27 22:57