力扣135. 分发糖果

原题链接

思路

  • 题目中对于每一个小朋友都需要考虑左右的关系
  • 这里考虑的贪心做法是:
    • 对于每一个小朋友(我)左边的人,如果评分比我高,则我的糖果数要比他多1个
    • 对于每一个小朋友(我)右边的人,如果评分比我高,则我的糖果数【至少】要比他多1个
  • 首先考虑第一种情况,直接从头开始遍历即可,不存在左边评分比我高的情况则糖果数为1
  • 其次考虑第二种情况,由于我的糖果数是由右边孩子决定的,所以一定要我右边孩子已经计算完毕的情况下才能计算我自身的数量,因此需要从后往前遍历

题解

class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> res(ratings.size(), 1);
        // 从前往后 分发符合左边孩子条件的糖果
        for(int i = 1; i < ratings.size(); i ++)
            if(ratings[i] > ratings[i - 1]) 
                res[i] = res[i - 1] + 1;
        // 从后往前 分发符合右边孩子条件的糖果
        for(int i = ratings.size() - 2; i >= 0; i --)
            if(ratings[i] > ratings[i + 1])
                res[i] = max(res[i], res[i + 1] + 1);
        int ans = 0;
        for(auto i : res) ans += i;
        return ans;
    }
};

Go代码

func candy(ratings []int) int {  
    res := make([]int, len(ratings))  
    sum := 0  
    res[0] = 1  
    for i := 1; i < len(ratings); i++ {  
        if ratings[i] > ratings[i-1] {  
            res[i] = res[i-1] + 1  
        } else {  
            res[i] = 1  
        }  
    }  
    for i := len(ratings) - 2; i >= 0; i-- {  
        if ratings[i] > ratings[i+1] {  
            res[i] = findMax(res[i], res[i+1]+1)  
        }  
    }  
    for _, v := range res {  
        sum += v  
    }  
    return sum  
}  
func findMax(a int, b int) int {  
    if a > b {  
        return a  
    }  
    return b  
}
posted @ 2023-10-13 17:18  Jannan  阅读(24)  评论(0)    收藏  举报