首页 > 编程语言 >贪心算法案例 - 分发糖果

贪心算法案例 - 分发糖果

时间:2024-10-27 18:19:58浏览次数:1  
标签:分发 遍历 ratings candies 孩子 int 糖果 贪心

贪心算法案例 - 分发糖果(Hard)

1. 题目描述

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:

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

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

2. 输出案例

输入是一个数组,表示孩子的评分。输出是最少糖果的数量。

Input: [1,0,2]

Output: 5

在上面的输入案例中,最少的糖果分法是[2, 1, 2]。

3. 分析

通常情况下我们认为解决贪心算法题目需要将对应的数组进行排序或者是选择,但是对于这道题来讲并不需要进行排序或者选择。我们只需要进行简单的遍历即可:

  • 首先将每个孩子的糖果数默认设置为1。
  • 先从左到右遍历一遍,如果右边孩子的分数大于左边孩子的分数,那么右边孩子获取到的糖果数为左边孩子糖果数+1。
  • 再从右往左进行遍历,如果左边孩子的糖果数大于右边孩子的糖果数,那么左边孩子的糖果数为 max(左边孩子糖果数,右边孩子糖果数+1),注意这里为什么不是"右边孩子糖果数+1"?这是因为这样做的话可能会破坏从左往右遍历已经确定好的糖果数分配!这里要特别注意。
  • 通过这两次遍历分配的糖果数就满足题目的要求了。

本题的贪心策略:在每次的遍历过程中,只考虑并更新相邻一侧的大小关系!

4. 代码

class Solution {
    public int candy(int[] ratings) {
        int count = 0;  // 统计总共糖果数

        int[] candies = new int[ratings.length];  // candies[i]表示第i个孩子获取到的糖果数字
        // 初始化每个孩子的糖果数为1
        for (int i = 0; i< candies.length; i++) {
            candies[i] = 1;
        }

        // 从左到右检查
        for (int i = 1; i< candies.length; i++) {
            if (ratings[i] > ratings[i-1]) {
                candies[i] = candies[i-1] +1;
            }
        }

        // 从右到左再检查一遍
        for (int i = ratings.length - 2; i >=0; i--) {
            if (ratings[i] > ratings[i+1]) {
                candies[i] = Math.max(candies[i+1] +1, candies[i]);
            }
        }

        for (int e: candies) {
            count += e;
        }

        return count;
    }
}

标签:分发,遍历,ratings,candies,孩子,int,糖果,贪心
From: https://www.cnblogs.com/lilyflower/p/18508711

相关文章

  • 贪心算法案例 - 分发饼干
    贪心算法案例-分发饼干(Easy)1.题目描述有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃最多一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子可以吃饱?2.输出案例输入两个数组,分别代表孩子的饥饿度和饼干......
  • [反悔贪心] Add One 2
    估计是全网最复杂题解。。。反向考虑:将\(a_i\)进行减操作,使得每个数都小于等于0。考虑差分,差分后将区间减转变为单点的加减,但是这样一来每个数都小于等于0的判定就变成了要判定前缀和是否都小于等于0,这不太好处理。考虑增加一个区间加操作,对\([l,r]\)的区间内的\(a_i\)......
  • 代码随想录算法训练营day26|455.分发饼干 376. 摆动序列 53. 最大子序和
    学习资料:https://programmercarl.com/贪心算法理论基础.html#算法公开课贪心算法Part1求局部最优解,最终达到全局最优455.分发饼干(大胃口吃大饼干)点击查看代码classSolution(object):deffindContentChildren(self,g,s):""":typeg:List[int]......
  • 【信奥赛·算法基础】CSP-J C++ 贪心算法示例汇总
    序言为了更清晰的了解贪心算法,我把常见的贪心算法示例做了一个总结,把问题和策略,以及代码示例放到了一起,方便学习和分析,这里示例仅以C++为例,其他语言可根据示例调整即可一、钱币找零问题问题描述:给定不同面额的钱币以及每种面额的数量,用最少的钱币张数凑齐给定的总金额。......
  • 初识调整法(贪心)
    引例:\(证明:圆内接四边形中正方形的面积最大\)$在圆上顺时针任取四点A,B,C,D构成凸四边形,固定对角线AC,分别令B,D在对应的圆弧上自由滑动.$$\becauseS_{四边形ABCD}=\frac{(d_{B-AC}+d_{D-AC})\cdot|AC|}2$$\therefore最大化S_{四边形ABCD}\Rightarrow......
  • 驾驭速度,连接世界 —— CDN内容分发网络的力量
    CDN,即内容分发网络,是一个由遍布全球的高性能加速节点组成的网络架构。它的主要目的是为客户提供快速、安全且可靠的全球内容分发加速服务。通过优化数据传输路径和减少网络延迟,CDN能够显著提升用户体验,确保用户能够迅速且顺畅地访问所需内容。产品优势多场景应用:CDN支持多种......
  • 鸿蒙NEXT应用上架与分发步骤详解
    大家好,我是V哥。今天的文章来聊一聊HarmonyOSNEXT应用上架。当你开发、调试完HarmonyOS应用/元服务,就可以前往AppGalleryConnect申请上架,华为审核通过后,用户即可在华为应用市场获取您的HarmonyOS应用/元服务。HarmonyOS会通过数字证书与Profile文件等签名信息来保证应用的完......
  • [学习笔记] 贪心
    写在前面参考《算法竞赛进阶指南》贪心部分(在[“基础算法”](?)那一部分)。(有些是直接抄的这本书上的。)XK给我们讲课的[课件](?)。2024.10.23模拟赛T2及其题解。(目前是这些)之后应该还有今年暑假集训时的贪心PPT。关于本文中“贪心”的含义本文所言的贪心是“广义”的,即不一......
  • Ftrans供应链文件分发平台:如何确保数据安全与合规性?
    传统制造企业在日常协作中,会涉及到像采购订单和合同、技术规格和图纸、质量标准和检验报告、库存和补货信息等文件分发需求。到在选择供应链文件分发平台时,需要考量以下因素,从而选择出合适的传输方式:1.安全性:确保文件在传输过程中的安全性是至关重要的。需要考虑传输方式是否支持......
  • CDN内容分发网络
    认识CDN◼什么是CDN呢?CDN称之为内容分发网络(ContentDeliveryNetwork或ContentDistributionNetwork,缩写:CDN)CDN它是一组分布在不同地理位置的服务器相互连接形成的网络系统。通过这个网络系统,将Web内容存放在距离用户最近的服务器。可以更快、更可靠地将Web内......