时间: o(n)
空间: o(n)
class Solution { public int candy(int[] ratings) { int[] candies = new int[ratings.length]; for (int i = 0; i < candies.length; i++) { candies[i] = 1; } for (int i = 1; i < ratings.length; i++) { if (ratings[i] > ratings[i - 1]) { candies[i] = candies[i - 1] + 1; } } int ans = candies[ratings.length - 1]; for (int i = ratings.length - 2; i >= 0; i--) { if (ratings[i] > ratings[i + 1]) { candies[i] = Math.max(candies[i], candies[i + 1] + 1); } ans += candies[i]; } return ans; } }取最大值的数理逻辑:
若左约束值大:说明为了满足左邻居,当前已经分配了足够多的糖果。这个数量已经天然大于了右邻居的要求,直接保留原值即可同时兼容两边。
若右约束值大:说明原有的糖果数不足以应付右邻居的配置。必须将糖果数提升至右约束标准。因为数值变大,它依然能够维持原本就比左邻居多的合法状态。