【算法问题】132 序列
刚好是 10 月 24 日程序员日,拖更了一万年的我决定来稍微写点东西。 来看看算法题里面的经典套路之单调栈吧。 认识单调栈 首先来看这样一个数组:[3, 1, 5, 8, 6, 4, 7, 2, 9],假设每个数字都等于这个数的身高,考虑这样一个问题:对于数组中的每个数,它左侧比它高的数里,离它最近的是谁? 逐一查看,我们可以写下答案:[-1, 3, -1, -1, 8, 6, 8, 7, -1]。但是如何用算法来解决这个问题? 首先考虑最左边的 3,由于它是最左侧的元素,直接标记下标 0 的答案为 -1,但是 3 可能成为后面的答案,所以我们可以拿一个「小本本」写下 3。 接下来是 1,我们检查「小本本」,发现它左侧的 3 比它高,所以下标为 1 的答案为 3。同样地,我们把 1 写进「小本本」。 再然后是 5,「小本本」上没有比它高的元素,因此填上 -1。这时我们可以发现一个问题,对于 5 右边的所有元素,答案都不再可能是 1 或者 3,因为如果一个数小于 3,那么必然也小于 5,而 5 比 3 离这些数都更近。 于是,我们在把 5 写进「小本本」之前,可以直接把 1 和 3 全部清空,因为它们不可能再成为答案了。 同样的道理,在把 8 写进「小本本」之前,我们可以清空 5;在把 7 写进「小本本」之前,我们可以清空 4 和 6,但左侧的 8 依然保留,因为不确定后面是不是会有另一个 7。...