面试经典150题——分发糖果

面试经典150题 day15

      • 题目来源
      • 我的题解
        • [方法一 两次不同方向的遍历(应该是贪心)](#方法一 两次不同方向的遍历(应该是贪心))
        • [方法二 贪心](#方法二 贪心)

题目来源

力扣每日一题;题序:135

我的题解

方法一 两次不同方向的遍历(应该是贪心)

遍历两次(左→右,右→左),得到分别两个方向的情况 ,最终 取两个遍历结果中的最大值 就是最后的分配方案
时间复杂度 :O(n)
空间复杂度:O(n)

java 复制代码
public int candy(int[] ratings) {
    int res=0;
    int n=ratings.length;
    int[] L=new int[n];
    int hight=1;
    for(int i=0;i<n-1;i++){
        while(i<n-1&&ratings[i]<ratings[i+1]){
            L[i]=hight;
            hight++;
            i++;
        }
        L[i]=hight;
        if(i<n-1)
            hight=1;
    }
    L[n-1]=hight;
    hight=1;
    for(int i=n-1;i>0;i--){
        while(i>0&&ratings[i]<ratings[i-1]){
            L[i]=Math.max(L[i],hight);
            hight++;
            i--;
        }
        L[i]=Math.max(L[i],hight);
        if (i>0)
            hight=1;
    }
    L[0]=Math.max(L[0],hight);
    for(int i=0;i<n;i++)
        res+=L[i];
    return res;
}
方法二 贪心

从左到右枚举每一个同学,记前一个同学分得的糖果数量为 pre:

  • 如果当前同学比上一个同学评分高,说明就在最近的递增序列中,直接分配给该同学 pre+1个糖果即可。
  • 否则就在一个递减序列中,直接分配给当前同学一个糖果,并把该同学所在的递减序列中所有的同学都再多分配一个糖果,以保证糖果数量还是满足条件。

无需显式地额外分配糖果,只需要记录当前的递减序列长度,即可知道需要额外分配的糖果数量。

同时注意当当前的递减序列长度和上一个递增序列等长时,需要把最近的递增序列的最后一个同学也并进递减序列中。

这样,只要记录当前递减序列的长度 dec,最近的递增序列的长度 inc 和前一个同学分得的糖果数量 pre 即可。
时间复杂度:O(n)

空间复杂度:O(1)

java 复制代码
public int candy(int[] ratings) {
    int n = ratings.length;
    int ret = 1;
    int inc = 1, dec = 0, pre = 1;
    for (int i = 1; i < n; i++) {
        if (ratings[i] >= ratings[i - 1]) {
            dec = 0;
            pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;
            ret += pre;
            inc = pre;
        } else {
            dec++;
            if (dec == inc) {
                dec++;
            }
            ret += dec;
            pre = 1;
        }
    }
    return ret;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
IronMurphy7 小时前
【算法四十三】279. 完全平方数
算法
lee_curry7 小时前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
墨染天姬7 小时前
【AI】Hermes的GEPA算法
人工智能·算法
papership7 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826527 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
九转成圣8 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
Beginner x_u8 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
wxy不爱写代码8 小时前
C++多线程
面试·职场和发展
直奔標竿9 小时前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
金銀銅鐵9 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端