贪心算法解决分发糖果问题

代码随想录链接: 代码随想录

思路:

由于每个孩子都要得到一块糖果,因此初始化一个全为1的数组,该数组的长度等于孩子的个数

从前往后遍历,如果位置i处的孩子对应的分数大于位置i-1处的孩子的分数,令该孩子 获得的糖果数量为位置i-1 处孩子获得的糖果数量+1

从后往前遍历数组中的每个元素,如果位置i处的孩子 对应的分数大于 位置i+1处的孩子 的分数,令该孩子 获得的糖果数量为位置i+1处孩子糖果数量+1原先该孩子获得的糖果数量最大值

两次遍历结束后,统计数组中的每个元素之和,即表示获得的最终结果

代码:

java 复制代码
class Solution {
    /**
         分两个阶段
         1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1
         2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大
    */
    public int candy(int[] ratings) {
        int len = ratings.length;
        int[] candyVec = new int[len];
        candyVec[0] = 1;
        for (int i = 1; i < len; i++) {
            candyVec[i] = (ratings[i] > ratings[i - 1]) ? candyVec[i - 1] + 1 : 1;
        }

        for (int i = len - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1]) {
                candyVec[i] = Math.max(candyVec[i], candyVec[i + 1] + 1);
            }
        }

        int ans = 0;
        for (int num : candyVec) {
            ans += num;
        }
        return ans;
    }
}
相关推荐
云泽80811 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
wlsh1511 小时前
Go 迭代器
算法
语戚12 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
CS创新实验室12 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法
Black蜡笔小新13 小时前
自动化AI算法训练服务器DLTM训推一体化平台助力农业生产管理实现安全智能化
人工智能·算法·自动化
8Qi814 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS14 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
松间听晚15 小时前
Agentic RL 环境和代码学习:以HGPO为例
算法
智者知已应修善业15 小时前
【51单片机用T0定时器方式1,实现0.5S的时间间隔实现第一次一个灯亮、第二次二个灯亮,直到全部灯亮,然后重复整个过程】2023-12-29
c++·经验分享·笔记·算法·51单片机
小许同学记录成长15 小时前
几何体编辑与布尔运算
算法·无人机