曾格的github

美的笔试--分糖果

有N个小朋友站在一排,每个小朋友都有一个评分
你现在要按以下的规则给孩子们分糖果:
  • 每个小朋友至少要分得一颗糖果
  • 分数高的小朋友要他比旁边得分低的小朋友分得的糖果多
你最少要分发多少颗糖果?
示例1

输入

[1,2,2]

输出

4

思路:

从左到右一次遍历,从右到左一次遍历,就ok了。

我的错误的思路:从左到右,看是升序还降序,然后话要考虑等于号,用了5个变量来记录遍历结果,很麻烦而且没写出来。

总结:多总结思路,常规思路往往是错的;需要考虑很多细节的方法也往往是错的。

class Solution {
public:
    int candy(vector<int> &ratings) {
        //题意:N个孩子站成一排,每个孩子分配一个分值。给这些孩子派发糖果,满足如下要求:
        //每个孩子至少一个
        //分值更高的孩子比他的相邻位的孩子获得更多的糖果
        //求至少分发多少糖果?
        int len=ratings.size();
        if(len==1) return 1;
        
        int sum=0;
        vector<int> v(len,1);//初始将每个孩子的糖果数都设为1
        
        //从左向右扫描,保证一个方向上分数更大的糖果更多
        for(int i=1;i<len;i++){
            if(ratings[i] > ratings[i-1])
                v[i]=v[i-1]+1;
        }
        //从右向左扫描,保证另一个方向上分数更大的糖果更多
        for(int i=len-2;i>=0;i--){
            if(ratings[i] > ratings[i+1] && v[i] <= v[i+1])
                v[i]=v[i+1]+1;
        }
        
        for(int i=0;i<len;i++){
            sum+=v[i];
        }
        return sum;
    }
};

 

posted @ 2021-09-22 15:46  曾格  阅读(80)  评论(0编辑  收藏  举报
Live2D