Java算法-力扣leetcode-135. 分发糖果

135. 分发糖果

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。

请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目

示例 1:

复制代码
输入: ratings = [1,0,2]
输出: 5
解释: 你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。

示例 2:

复制代码
输入: ratings = [1,2,2]
输出: 4
解释: 你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
     第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

提示:

  • n == ratings.length
  • 1 <= n <= 2 * 104
  • 0 <= ratings[i] <= 2 * 104

解:

  • 遍历一次找到最小的数。确定当前位置为最少的一个糖果

  • 从最小位置向右遍历

  • 如果下一个位置大于前一位值 那么下一个位置糖果数+1

  • 如果下一个位置小于前一位值 那么下一个位置糖果数=1 . 当小于前一位置时,循环往回遍历.判断前一位是不是大于下一位 并且糖果数是不是大于小一位 如果是 就将前一个位置糖果数+1, 继续往后走一位判断. 直到前一位不再大于后一位置的值.

  • 从最小位置向左遍历 与上面逻辑一样

    class Solution {
    public int candy(int[] ratings) {
    int[] result = new int[ratings.length];
    int minIndex = 0;
    for (int i = 1; i < ratings.length; i++) {
    if (ratings[i] < ratings[minIndex]) {
    minIndex = i;
    }
    }
    //找到最小位置
    result[minIndex] = 1;

    复制代码
              //从最小位置向左遍历
              if (minIndex != 0) {
                  for (int i = minIndex - 1; i >= 0; i--) {
                      //如果下一个位置大于前一位值 那么下一个位置糖果数+1
                      if (ratings[i] > ratings[i + 1]) {
                          result[i] = result[i + 1] + 1;
                      } else {
                          //如果下一个位置小于前一位值 那么下一个位置糖果数=1 
                          result[i] = 1;
    
                          int index = i;
                          // 当小于前一位置时,循环往回遍历.判断前一位是不是大于下一位 并且糖果数是不是大于小一位 如果是 就将前一个位置糖果数+1, 继续往后走一位判断. 直到前一位不再大于后一位置的值.
                          while (ratings[index + 1] > ratings[index] && result[index + 1] <= result[index]) {
                              result[index + 1] = result[index] + 1;
                              index++;
                          }
    
                      }
    
                  }
              }
    
              //从最小位置向右遍历
              if (minIndex != (ratings.length - 1)) {
                  for (int i = minIndex + 1; i < ratings.length; i++) {
                      if (ratings[i] > ratings[i - 1]) {
                          result[i] = result[i - 1] + 1;
                      } else {
                          result[i] = 1;
    
                          int index = i;
                          while (ratings[index - 1] > ratings[index] && result[index - 1] <= result[index]) {
                              result[index - 1] = result[index] + 1;
                              index--;
                          }
    
                      }
    
                  }
              }
    
              int r = 0;
              for (int i = 0; i < result.length; i++) {
                  r = r + result[i];
              }
              return r;
          }

    }

相关推荐
小肝一下18 小时前
每日两道力扣,day8
c++·算法·leetcode·哈希算法·hot100
历程里程碑18 小时前
二叉树---二叉树的中序遍历
java·大数据·开发语言·elasticsearch·链表·搜索引擎·lua
小信丶18 小时前
Spring Cloud Stream EnableBinding注解详解:定义、应用场景与示例代码
java·spring boot·后端·spring
无限进步_18 小时前
【C++】验证回文字符串:高效算法详解与优化
java·开发语言·c++·git·算法·github·visual studio
亚历克斯神18 小时前
Spring Cloud 2026 架构演进
java·spring·微服务
七夜zippoe18 小时前
Spring Cloud与Dubbo架构哲学对决
java·spring cloud·架构·dubbo·配置中心
海派程序猿18 小时前
Spring Cloud Config拉取配置过慢导致服务启动延迟的优化技巧
java
阿维的博客日记18 小时前
为什么不逃逸代表不需要锁,JIT会直接删掉锁
java
William Dawson18 小时前
CAS的底层实现
java
Meme Buoy18 小时前
18.补充数学1:生成树-最短路径-最大流量-线性规划
数据结构·算法