135. 分发糖果
点击查看代码
class Solution {
public:
int candy(vector<int>& ratings) {
int count;
count = ratings.size();
vector<int> candy(count, 0);
for(int i = 0; i < ratings.size() - 1; i++){
if(ratings[i] > ratings[i+1]){
if(candy[i] < candy[i+1]){
count += candy[i+1] - candy[i];
candy[i] = candy[i+1];
}
if(candy[i] == candy[i+1]){
// 忘记给candy++
count++;
candy[i]++;
}
}
if(ratings[i] < ratings[i+1]){
if(candy[i] > candy[i+1]){
count += candy[i] - candy[i+1];
candy[i+1] = candy[i];
}
if(candy[i] == candy[i+1]){
// 忘记给candy++
count++;
candy[i+1]++;
}
}
}
// 逆序再遍历一次 若糖果数量相同或小于 但评分大于 则需要对前者++
for(int i = ratings.size() - 1; 0 < i; i--){
if(ratings[i-1] > ratings[i]){
if(candy[i-1] < candy[i]){
count += candy[i] - candy[i-1];
candy[i-1] = candy[i];
}
if(candy[i-1] == candy[i]){
// 忘记给candy++
count++;
candy[i-1]++;
}
}
}
return count;
}
};
1040 有几个PAT (25 point(s)) 思路跟之前这题类似,需要正序逆序进行遍历。
由于跟着测试数据凑着去写,所以写了不少冗余代码。
要优化的地方在于,遍历一次时,只需要对一种情况(大于或小于)进行判断。
最后加上的时候,可以在逆序遍历时进行比较并求和。
根据题目条件 “每个孩子至少分配到 1 个糖果” 所以参考代码里面需要对第一次判断进行初始化。
left[i] = 1;
right = 1;