77 lines
2.9 KiB
Markdown
77 lines
2.9 KiB
Markdown
|
||
## 思路
|
||
|
||
这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,如果两边一起考虑就会顾此失彼。
|
||
|
||
本题贪心贪在哪里呢?
|
||
|
||
先确定每个孩子左边的情况(也就是从前向后遍历)
|
||
|
||
如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心:candyVec[i] = candyVec[i - 1] + 1
|
||
|
||
代码如下:
|
||
|
||
```C++
|
||
// 从前向后
|
||
for (int i = 1; i < ratings.size(); i++) {
|
||
if (ratings[i] > ratings[i - 1]) candyVec[i] = candyVec[i - 1] + 1;
|
||
}
|
||
```
|
||
|
||
如图:
|
||
|
||

|
||
|
||
再确定每个孩子右边的情况(从后向前遍历)
|
||
|
||
遍历顺序这里有同学可能会有疑问,为什么不能从前向后遍历呢?
|
||
|
||
因为如果从前向后遍历,根据 ratings[i + 1] 来确定 ratings[i] 对应的糖果,那么每次都不能利用上前一次的比较结果了。
|
||
**所以确定每个孩子右边的情况一定要从后向前遍历!**
|
||
|
||
此时又要开始贪心,如果 ratings[i] > ratings[i + 1],就取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,**因为candyVec[i]只有取最大的才能既保持对左边candyVec[i - 1]的糖果多,也比右边candyVec[i + 1]的糖果多**。
|
||
|
||
如图:
|
||
|
||

|
||
|
||
所以代码如下:
|
||
|
||
```C++
|
||
// 从后向前
|
||
for (int i = ratings.size() - 2; i >= 0; i--) {
|
||
if (ratings[i] > ratings[i + 1] ) {
|
||
candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1);
|
||
}
|
||
}
|
||
```
|
||
|
||
整体代码如下:
|
||
```C++
|
||
class Solution {
|
||
public:
|
||
int candy(vector<int>& ratings) {
|
||
vector<int> candyVec(ratings.size(), 1);
|
||
// 从前向后
|
||
for (int i = 1; i < ratings.size(); i++) {
|
||
if (ratings[i] > ratings[i - 1]) candyVec[i] = candyVec[i - 1] + 1;
|
||
}
|
||
// 从后向前
|
||
for (int i = ratings.size() - 2; i >= 0; i--) {
|
||
if (ratings[i] > ratings[i + 1] ) {
|
||
candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1);
|
||
}
|
||
}
|
||
// 统计结果
|
||
int result = 0;
|
||
for (int i = 0; i < candyVec.size(); i++) result += candyVec[i];
|
||
return result;
|
||
}
|
||
};
|
||
```
|
||
|
||
> **我是[程序员Carl](https://github.com/youngyangyang04),[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png)可以找我,本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
|
||
|
||
**如果感觉题解对你有帮助,不要吝啬给一个👍吧!**
|
||
|