1. 题目来源
链接:135. 分发糖果
题单:
- 待补充
2. 题目解析
思路:
- 没有成为一个环,那么就是个数组,顺推一下就行了。
- 如果当前的
arr[i] > arr[i-1]
那么,L[i] = L[i-1]+1
。否则,L[i]=1
- 显然,上式只考虑了当前元素大于左边元素的情况。而题目存在可能是当前元素大于右边元素的情况呢?
- 即,
res[i]>res[i+1]
时,即有R[i] = R[i+1]+1
- 那么,两者结合取最大值就能同时满足 左、右 两边的要求了。
res[i] = max(L[i], R[i])
综上,本题蕴含着 前后缀分解 的意思。如果题中有 左右同时 这种强规则的话,不妨分成左、右两个方向去进行考虑。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
方法一:前后缀分解
func candy(ratings []int) int {
n := len(ratings)
L, R := make([]int, n), make([]int, n)
L[0], R[n - 1] = 1, 1
for i := 1; i < n; i ++ {
if ratings[i] > ratings[i - 1] {
L[i] = L[i - 1] + 1
} else {
L[i] = 1
}
}
for i := n - 2; i >= 0; i -- {
if ratings[i] > ratings[i + 1] {
R[i] = R[i + 1] + 1
} else {
R[i] = 1
}
}
res := 0
for i := 0; i < n; i ++ {
res += max(L[i], R[i])
}
return res
}