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;

posted on 2022-08-04 10:03  Atl212  阅读(13)  评论(0编辑  收藏  举报

导航