检查数组是否是单峰的

时间:2018-09-09 07:47:58

标签: c arrays

整数数组是单峰的,如果:

开始时严格增加; 之后,它是恒定的; 在那之后,它是严格减少的。 可能没有第一个块(增加)和最后一个块(减少)。允许这两个块都不存在。

例如,以下三个数组是单峰的:[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部分减少吗?

1 个答案:

答案 0 :(得分:2)

虽然可以为单峰曲线中的每个可能阶段在三个循环中对此进行编码,但是这种“有状态”算法并不是特别数学。注意,通过在变量中而不是代码控制流中保留状态,可以在单个循环中使用等效的有状态算法。

测试单个公分母可能在数学上更鲁棒(或者至少证明了对这种曲线的数学的理解),并且更简单-即对于单峰上的每个点都成立的共同关系曲线,但不适用于任何非单峰曲线。这样,您可以在单个循环中以算术方式执行测试,而不是通过控制流或状态转换。

在这种情况下,一个单一的公分母-一个数学上定义曲线的公分母是:曲线梯度的正负是递减单调的

Signum是一个函数,使signum(a)为:

  • 如果a == 0,则为0,
  • 如果a> 0,则为1,
  • -1,如果<0

减少单调表示该值下降或保持不变,但从不上升-下降或平稳。

任意位置的梯度仅为d [n + 1]-d [n]。因此,循环从另一个元素中减去一个元素,确定符号,然后将其与前一个符号进行比较。如果信号增加,则曲线不是单峰的。也就是说,它可以上升,只能是平坦的或仅下降,或者它可以上升和下降,但再也不会上升,并且具有任何水平的高原。

请注意,此解决方案适用于单峰曲线的数学定义;您的问题中的定义有些含糊,似乎不允许多个平台期。也就是说,它允许:

   _________
  /         \
 /           \
/             \

但不包括例如:

      ___
     /   \
 ___/     \____
/              \

但是我认为第二个显然是单峰的。

来自:https://en.wikipedia.org/wiki/Unimodalityenter image description here

最后一部分是关键-零不算。不管多么微妙,它都适用于所有测试用例。