• LeetCode每日一题 分发糖果


    题目描述

    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.分别从左向右和从右向左遍历两次数据,分别求出最小被分得的糖果数量,每个人最终分得的糖果数量即为这两个数量的最大值

    2.将数组中数字分为上升和下降两个序列,如果是上升序列,糖果数+1,如果是下降序列,给当前元素分一颗糖,然后下降序列元素的糖果数同时+1,如果两个元素相同,则将后面的元素的糖果数设为1,最后计算总的糖果数。

    题解:

    思路一:

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

    思路二:

    1. class Solution {
    2. public int candy(int[] ratings) {
    3. //获取评分数组的长度
    4. int n=ratings.length;
    5. //初始化返回的糖果数为1
    6. int ret=1;
    7. //初始化递增,递减序列的长度和前一个孩子的糖果数
    8. int inc=1,dec=0,pre=1;
    9. for(int i=1;i//从第二个孩子开始遍历
    10. {
    11. if(ratings[i]>=ratings[i-1]){//当前孩子的评分不小于前一个孩子
    12. //递增序列
    13. dec=0;//重置递减序列长度
    14. pre=ratings[i]==ratings[i-1]?1:pre+1;//如果评分相同,重置pre为1,否则pre递增
    15. ret+=pre;//将当前孩子的糖果数加在总糖果数上
    16. inc=pre;//更新递增序列的长度
    17. }else{
    18. //递减序列
    19. dec++;
    20. if(dec==inc){// 当递减序列长度和递增序列长度相等时,把最近的递增序列的最后一个同学也并进递减序列中
    21. dec++;
    22. }
    23. ret+=dec;// 将当前孩子的糖果数加到总糖果数上
    24. pre=1;// 重置前一个孩子的糖果数,因为下一个孩子可能开始一个新的序列
    25. }
    26. }
    27. return ret;// 返回最小糖果数
    28. }
    29. }
  • 相关阅读:
    数据结构与算法八股文--概念篇
    操作系统·处理机调度死锁
    智能时代的智能工具(gpt)国产化助手
    外包就干了2个月,技术退步明显....
    10个问题说清楚 什么是元宇宙 - 十问元宇宙:如何将抽象的概念具象化?
    Linux上配置NAT
    深度学习(4):Word2Vec 字&词向量的训练和使用
    基于Spring Boot的留学服务管理平台的设计与开发-计算机毕业设计源码
    SuperMap iDesktop如何将地图瓦片加密切图到MongoDB 4.X版本
    tomcat 命令行窗口乱码
  • 原文地址:https://blog.csdn.net/weixin_52956719/article/details/140301584