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

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

思路:

由于每个孩子都要得到一块糖果,因此初始化一个全为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;
    }
}
相关推荐
愚戏师7 分钟前
从零到一学习c++(基础篇--筑基期十一-类)
开发语言·数据结构·c++·学习·算法
小仙有礼了1 小时前
ArcGis for js 4.x实现测量,测距,高程的功能
javascript·算法·arcgis
轩源源1 小时前
unordered_set和unordered_map的使用
开发语言·数据结构·c++·算法·哈希算法·unordered_map·unordered_set
白白糖2 小时前
Day 49 卡玛笔记
python·算法·力扣
01_2 小时前
力扣hot100——岛屿数量 岛屿问题经典dfs总结
算法·leetcode·dfs
没明白白2 小时前
冒泡排序:简单又易于实现的排序算法
算法·排序算法
脑洞专家5 小时前
角点检测算法各自优缺点
人工智能·算法·计算机视觉
C#Thread6 小时前
机器视觉--Halcon的数据结构(数组)
算法
垠二7 小时前
L2-4 寻宝图
数据结构·算法
东方芷兰10 小时前
算法笔记 04 —— 算法初步(下)
c++·笔记·算法