Skip to content

Commit 0b66e87

Browse files
Create 135. 分发糖果.md
1 parent 0b733f8 commit 0b66e87

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

Methodology/135. 分发糖果.md

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#### 135. 分发糖果
2+
3+
难度:困难
4+
5+
---
6+
7+
`n` 个孩子站成一排。给你一个整数数组 `ratings` 表示每个孩子的评分。
8+
9+
你需要按照以下要求,给这些孩子分发糖果:
10+
11+
* 每个孩子至少分配到 `1` 个糖果。
12+
* 相邻两个孩子评分更高的孩子会获得更多的糖果。
13+
14+
请你给每个孩子分发糖果,计算并返回需要准备的 **最少糖果数目**
15+
16+
**示例 1:**
17+
18+
```
19+
输入:ratings = [1,0,2]
20+
输出:5
21+
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
22+
```
23+
24+
**示例 2:**
25+
26+
```
27+
输入:ratings = [1,2,2]
28+
输出:4
29+
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
30+
第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。
31+
```
32+
33+
**提示:**
34+
35+
* `n == ratings.length`
36+
* `1 <= n <= 2 * 10^4`
37+
* `0 <= ratings[i] <= 2 * 10^4`
38+
39+
---
40+
41+
两遍遍历:
42+
43+
1. 第一次从左向右遍历,记录当前数只与相邻****数比较后应获得的糖果数
44+
2. 第二次从右向左遍历,记录当前数只与相邻****数比较后应获得的糖果数,两者取最大值。
45+
46+
根据题意,需要准备**最少**的糖果数,因此相邻数进行比较时,评分高的孩子的糖果数一定是比评分低的只多一颗糖果。
47+
48+
```
49+
func candy(ratings []int) int {
50+
n := len(ratings)
51+
candies := make([]int, n)
52+
for i := range candies {
53+
candies[i] = 1
54+
}
55+
for i := 1; i < n; i++ {
56+
if ratings[i] > ratings[i - 1] {
57+
candies[i] = candies[i - 1] + 1
58+
}
59+
}
60+
for i := n - 2; i >= 0; i-- {
61+
if ratings[i] > ratings[i + 1] {
62+
candies[i] = max(candies[i], candies[i + 1] + 1)
63+
}
64+
}
65+
res := 0
66+
for i := range candies {
67+
res += candies[i]
68+
}
69+
return res
70+
}
71+
```

0 commit comments

Comments
 (0)