当前位置:   article > 正文

LeetCode--135

LeetCode--135

135. 分发糖果

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

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

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

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

示例 1:

输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。

示例 2:

输入:ratings = [1,2,2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
     第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

提示:

  • n == ratings.length
  • 1 <= n <= 2 * 104
  • 0 <= ratings[i] <= 2 * 104

毫无头绪,看来是脑子不好使。

让我来瞅瞅正确答案:

  1. class Solution {
  2. public:
  3. int candy(vector<int>& ratings) {
  4. int n=ratings.size();
  5. vector<int>left(n);
  6. for(int i=0;i<n;i++)
  7. {
  8. if(i>0&&ratings[i]>ratings[i-1])
  9. {
  10. left[i]=left[i-1]+1;
  11. }
  12. else{
  13. left[i]=1;
  14. }
  15. }
  16. int right=0,ret=0;
  17. for(int i=n-1;i>=0;i--)
  18. {
  19. if(i<n-1&&ratings[i]>ratings[i+1])
  20. right++;
  21. else
  22. right=1;
  23. ret+=max(left[i],right);
  24. }
  25. return ret;
  26. }
  27. };

先容我细细品味,是先从左到右遍历,而后从右往左遍历。嗯嗯嗯。。。

我们可以将「相邻的孩子中,评分高的孩子必须获得更多的糖果」这句话拆分为两个规则,分别处理。

左规则:当 ratings[i−1]<ratings[i]\textit{ratings}[i - 1] < \textit{ratings}[i]ratings[i−1]<ratings[i] 时,iii 号学生的糖果数量将比 i−1i - 1i−1 号孩子的糖果数量多。

右规则:当 ratings[i]>ratings[i+1]\textit{ratings}[i] > \textit{ratings}[i + 1]ratings[i]>ratings[i+1] 时,iii 号学生的糖果数量将比 i+1i + 1i+1 号孩子的糖果数量多。

我们遍历该数组两次,处理出每一个学生分别满足左规则或右规则时,最少需要被分得的糖果数量。每个人最终分得的糖果数量即为这两个数量的最大值

具体地,以左规则为例:我们从左到右遍历该数组,假设当前遍历到位置 iii,如果有 ratings[i−1]<ratings[i]\textit{ratings}[i - 1] < \textit{ratings}[i]ratings[i−1]<ratings[i] 那么 iii 号学生的糖果数量将比 i−1i - 1i−1 号孩子的糖果数量多,我们令 left[i]=left[i−1]+1\textit{left}[i] = \textit{left}[i - 1] + 1left[i]=left[i−1]+1 即可,否则我们令 left[i]=1\textit{left}[i] = 1left[i]=1。

在实际代码中,我们先计算出左规则 left\textit{left}left 数组,在计算右规则的时候只需要用单个变量记录当前位置的右规则,同时计算答案即可。

let me retry。

我的问题是理解错了题意:题目是,评分高的孩子必须获得更多的糖果,而不是获得更多糖果的孩子一定评分高。

所以我一直在考虑的第一个孩子和第二个孩子的评分相同,糖果数量也想通其实是多虑了。

  1. class Solution {
  2. public:
  3. int candy(vector<int>& ratings) {
  4. int len=ratings.size();
  5. vector<int>left(len,1);
  6. vector<int>right(len,1);
  7. for(int i=1;i<len;i++)
  8. {
  9. if(ratings[i]>ratings[i-1])
  10. left[i]=left[i-1]+1;
  11. else
  12. left[i]=1;
  13. }
  14. for(int i=len-2;i>=0;i--)
  15. {
  16. if(ratings[i]>ratings[i+1])
  17. right[i]=right[i+1]+1;
  18. else
  19. right[i]=1;
  20. }
  21. int ret=0;
  22. for(int i=0;i<len;i++)
  23. {
  24. ret+=max(left[i],right[i]);
  25. }
  26. return ret;
  27. }
  28. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/165266
推荐阅读
相关标签
  

闽ICP备14008679号