题目 https://leetcode.cn/problems/candy/submissions/
官方题解 https://leetcode.cn/problems/candy/solution/fen-fa-tang-guo-by-leetcode-solution-f01p/
每个数字一定存在于唯一的山峰上,比方说下图的[1,2,4,3,2,1]组成一个山峰。如果是[1,2,1,2,1]呢?就有两个山峰。我们定义两个位置的点: 山坡脚和山坡上。
- 如果一个数字左右两侧是单调的,或者它大于左右两侧(山顶),那么它在山坡上。
- 否则,它在山坡脚。符合情况的比如左右两侧都等于/大于自身,左侧或右侧等于/自身。
- 每两个山坡脚之间的数都可以看做一座山峰。
比如在ratings=[2,3,4,3,3,2,3]里, 加粗体的ratings[0], ratings[3], ratings[5]是山坡脚,其它位置是山坡上。山坡脚的位置值一定是能取,且应当取1的(如果不取了大于1的数,那么将其替换为1,可以得到更优解)。
然后,山坡上位置的值,都由它所在的那个山峰决定的。山顶的值取决于它两个山坡中高度更高的那个。比如在ratings[0:4]之间,由于山脚res[0]、res[3]都是取1,而山顶ratings[2]的左山坡高度为3,右山坡高度为2,所以res[2]=3。而ratings[1]在左山坡,所以res[1]=2。
证明了这一点,我们就能明白,为什么从左到右,再从右到左遍历,得到的值是正确的了。因为一个位置的值,只会由它的山峰左右两侧的山坡决定。
所以代码如下:
class Solution {
public int