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

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

相关推荐
槐月初叁3 分钟前
多模态推荐系统指标总结
算法
迪小莫学AI19 分钟前
LeetCode 2588: 统计美丽子数组数目
算法·leetcode·职场和发展
昂子的博客26 分钟前
热门面试题第十天|Leetcode150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素
算法
新智元27 分钟前
哥大本科生靠 AI 横扫硅谷大厂 offer,学校震怒!预言码农两年内淘汰准备退学
人工智能·面试
Forget the Dream42 分钟前
设计模式之迭代器模式
java·c++·设计模式·迭代器模式
大丈夫在世当日食一鲲1 小时前
Java中用到的设计模式
java·开发语言·设计模式
A-Kamen1 小时前
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
java·spring boot·后端
练川1 小时前
Stream特性(踩坑):惰性执行、不修改原始数据源
java·stream
狂奔小菜鸡1 小时前
Java运行时数据区
java·jvm·后端
lovebugs1 小时前
Java并发编程之Lock机制:更灵活的线程同步方案
后端·面试