【LeetCode】NO.135 分发糖果 (C++ & Python) [贪心算法]

题目

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/candy
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

  1. 首先想到的是每次考虑左右,但是这样又跟下一个产生联系,很难实现;
  2. 其次考虑从左到右保证右边孩子大于左边
    在从后往前考虑左边孩子要大于右边
  3. 一开始初始化ans 为全1,保证每个孩子都有
    从左到右索引从1开始,保证i-1取得到;直到遍历完最后一个;
    从右向左遍历,要保证ratings[i+1]不越界,从len(ratings)-2,开始(-1是最后一个元素下标)到0(由于range()左闭右开,所以到0,每次-1)

代码

Python 版本:


class Solution:
    def candy(self, ratings: List[int]) -> int:
        li = [1]*len(ratings)
        for i in range(1,len(ratings)):
            if ratings[i]>ratings[i-1]:
                li[i] = li[i-1]+1
        for i in range(len(ratings)-2,-1,-1):
            if ratings[i]>ratings[i+1]:
                li[i] = max(li[i],li[i+1]+1)
        return sum(li)

C++ 版本:

class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> ans(ratings.size(),1);
        int sum = 0;
        for(int i=1;i<ratings.size();i++)
        {
            if (ratings[i]>ratings[i-1])
            {
                ans[i] = ans[i-1] + 1;
            }

        }
        for(int i=ratings.size()-2;i>=0;i--)
        {
            if (ratings[i]>ratings[i+1])
            {
                ans[i] = max(ans[i],ans[i+1]+1);
            }
        }
        for(int i=0;i<ratings.size();i++)
        {
            sum += ans[i];
        }
        return sum; 
    }
    
};
posted @ 2021-12-27 21:55  jucw  阅读(220)  评论(0编辑  收藏  举报