[Java][Leetcode hard] 135. 分发糖果

没做出来

官解1: 两次循环分别求i左右侧糖果数量限制,取二者最大值。

java 复制代码
class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        
        int[] left = new int[n];
        // i左侧的糖果数需要满足的要求:保证满足上升趋势需求
        for(int i=0; i<n;i++){
            if(i>0 && ratings[i] > ratings[i-1]){
                left[i] = left[i-1] + 1;
            }else{
                left[i] = 1;
            }
        }

      // i右侧的糖果数需要满足的要求:保证满足下降趋势需求
      // 例如 3、2、1  那么为了保证1最小糖果为1-->对应的元素为1,那么2-->最小是2,3--->3.
        int right = 0, res = 0;
        for(int i=n-1;i>=0;i--){
            if(i < n-1 && ratings[i] > ratings[i+1] ){
                right++;
            }else{
                right = 1;
            }
            
            res += Math.max(right, left[i]);  
            // 左右糖果的限制,取二者的最大值:保证同时满足二者的要求
        }

        return res;
    }
}

常量空间解法

解释一下这里为什么要 res++:考虑一下这个样例: 1 3 2 1:

如果不加1的话,按照这个代码: 糖果是:1 2 1 2 但是很明显321的话 3对应的人应该最少分3个糖果,这就会出现错误。

if(down >= up){

res++;

}

java 复制代码
class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        
        int res = 1;

        // 默认第一个元素为上升序列
        int cur = 1;  // 记录上升过程中的,应该最少的糖果数
        int up = 1;  // 记录上升趋势
        int down = 0; // 记录下降趋势

        for(int i=1;i<n;i++){
            if(ratings[i]> ratings[i-1]){
                // 上升序列
                down = 0;

                cur++;
                up = cur;

                res += cur;
            }else if(ratings[i] == ratings[i-1]){
                down = 0;
                cur = 1;
                up = 1;

                res += 1;
            }else{
                down ++; 
                cur = 1;

                res += down;
                if(down >= up){
                   res++;
                }
            }
        }

        return res;
    }
}
相关推荐
晨曦中的暮雨11 分钟前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
怕浪猫19 分钟前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
文丑颜不良啊2 小时前
LeetCode876~900题目解析
java·leetcode
罗西的思考2 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
aloha_7892 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
淡海水2 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
知守观3 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅3 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog3 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
SL_staff3 小时前
JVS私有化文档系统上线避坑指南:5大运维与业务协同断点及检测加固实践
java·开源·全栈