算法:在圆圈中找到峰值

标签 algorithm language-agnostic geometry

给定 n 个整数,排列成一个圆圈,展示一种可以找到一个峰的高效算法。一个峰值是一个不小于它旁边的两个数字的数字。

一种方法是遍历所有整数并检查每个整数是否为峰值。这产生了 O(n) 时间。似乎应该有一些分而治之的方法来提高效率。

最佳答案

编辑

好吧,Keith Randall 证明我错了。 :)

这是用 Python 实现的 Keith 解决方案:

def findPeak(aBase):
    N = len(aBase)
    def a(i): return aBase[i % N]

    i = 0
    j = N / 3
    k = (2 * N) / 3
    if a(j) >= a(i) and a(j) >= a(k)
        lo, candidate, hi = i, j, k
    elif a(k) >= a(j) and a(k) >= a(i):
        lo, candidate, hi = j, k, i + N
    else:
        lo, candidate, hi = k, i + N, j + N


    # Loop invariants:
    # a(lo) <= a(candidate)
    # a(hi) <= a(candidate)

    while lo < candidate - 1 or candidate < hi - 1:
        checkRight = True
        if lo < candidate - 1:
            mid = (lo + candidate) / 2
            if a(mid) >= a(candidate):
                hi = candidate
                candidate = mid
                checkRight = False
            else:
                lo = mid
        if checkRight and candidate < hi - 1:
            mid = (candidate + hi) / 2
            if a(mid) >= a(candidate):
                lo = candidate
                candidate = mid
            else:
                hi = mid

    return candidate % N

关于算法:在圆圈中找到峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12867018/

相关文章:

language-agnostic - 内存访问的成本是多少?

javascript - Three.js - 使用深度和方向向量的 ExtrudeGeometry

algorithm - L 系统节点重写示例

javascript - 如果存在于另一个对象数组中,则从对象数组中的数组中删除元素

algorithm - 老师的算法

algorithm - 计算 'local convex hulls'并集的快速算法

language-agnostic - 可接受的类型用作HashTable中的键

language-agnostic - 控件和小部件之间有什么区别吗?

javascript - 如何在给定 JavaScript 中的 Schläfli 符号的庞加莱圆盘上绘制双曲曲面分割?

c++ - 圆弧计算点