面试经典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;
}

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

相关推荐
宸津-代码粉碎机4 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
噢,我明白了5 小时前
java中唯一键和幂等键的应用
java·后端
程序猿乐锅5 小时前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
专注仿真5 小时前
ACM算法
算法·深度优先
考虑考虑5 小时前
synchronized字符串常量
java·后端·java ee
长谷深风1115 小时前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
m0_587383006 小时前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析
Escalating_xu6 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
周杰偷奶茶6 小时前
【Java】数据类型与变量
java·开发语言
code斗6 小时前
Java数据结构:堆详解
java·开发语言·数据结构