整数数组是单峰的,如果:
开始时严格增加; 之后,它是恒定的; 在那之后,它是严格减少的。 可能没有第一个块(增加)和最后一个块(减少)。允许这两个块都不存在。
例如,以下三个数组是单峰的:[5,7,11,11,2,1],[4,4,2],[7],但是以下三个数组不是单峰的:[5, 5,6,6,1],[1,2,1,2],[4,5,5,6]。
编写一个C程序来检查数组是否为单峰。 限制:函数应按n的顺序运行。 数组元素之间最多只能进行n-1个比较操作。
我可以使用3个while循环(非嵌套)并检查数组的3个部分,如果第1部分增加,那么第2部分恒定,而第3部分减少吗?
答案 0 :(得分:2)
虽然可以为单峰曲线中的每个可能阶段在三个循环中对此进行编码,但是这种“有状态”算法并不是特别数学。注意,通过在变量中而不是代码控制流中保留状态,可以在单个循环中使用等效的有状态算法。
测试单个公分母可能在数学上更鲁棒(或者至少证明了对这种曲线的数学的理解),并且更简单-即对于单峰上的每个点都成立的共同关系曲线,但不适用于任何非单峰曲线。这样,您可以在单个循环中以算术方式执行测试,而不是通过控制流或状态转换。
在这种情况下,一个单一的公分母-一个数学上定义曲线的公分母是:曲线梯度的正负是递减单调的。
Signum是一个函数,使signum(a)为:
减少单调表示该值下降或保持不变,但从不上升-下降或平稳。
任意位置的梯度仅为d [n + 1]-d [n]。因此,循环从另一个元素中减去一个元素,确定符号,然后将其与前一个符号进行比较。如果信号增加,则曲线不是单峰的。也就是说,它可以上升,只能是平坦的或仅下降,或者它可以上升和下降,但再也不会上升,并且具有任何水平的高原。
请注意,此解决方案适用于单峰曲线的数学定义;您的问题中的定义有些含糊,似乎不允许多个平台期。也就是说,它允许:
_________
/ \
/ \
/ \
但不包括例如:
___
/ \
___/ \____
/ \
但是我认为第二个显然是单峰的。
来自:https://en.wikipedia.org/wiki/Unimodality:
最后一部分是关键-零不算。不管多么微妙,它都适用于所有测试用例。