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

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

相关推荐
吾日三省吾码2 小时前
JVM 性能调优
java
LNTON羚通2 小时前
摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现
算法·目标检测·音视频·监控·视频监控
弗拉唐3 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi773 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
少说多做3434 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀4 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
哭泣的眼泪4084 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
清炒孔心菜4 小时前
每日一题 LCR 078. 合并 K 个升序链表
leetcode
蓝黑20204 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea