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

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

相关推荐
程序员黑豆14 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
江畔柳前堤15 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
hey_sml15 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo15 小时前
数据结构-环形链表
java·数据结构·链表
Forever Nore16 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
萧瑟余晖17 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才17 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio18 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
罗西的思考18 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX19 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm