(贪心) LeetCode 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

二. 解题思路

本题题意也是比较清楚,给每一个孩子分配糖果,至少一颗,每个孩子的左侧或者右侧的孩子的评分如果比相邻的孩子高则分到的糖果的数量也多。问满足条件分到的最少的糖果总数;

我们首先定义一个关于每一个孩子分到糖果数量的vector 数组,然后我们就得考虑怎样分配糖果才能使得每一个孩子的左右侧都满足,如果你想同时满足两侧显然是不可能的,所以我i们分为两步执行,先满足右侧,再倒着执行一次,满足左侧的孩子。

如下图所示,我们先从左到右遍历一遍,如果当前的大于左侧的,就在左侧的位置上加1作为当前分配的糖果数量,否则直接分配1。

再从右往左比较右孩子的大小,如果当前位置的大于右侧孩子就将当前位置的糖果和右侧孩子的糖果加1 取一个最大值即可。

最后只需要遍历一遍将结果累加输出即可。

话不多说!!!上代码!!

三. 代码

cpp 复制代码
class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();
        vector<int> candy(n);
        candy[0] = 1;
        for(int i = 1; i < n; i++){  // 从左到右开始遍历
            if(ratings[i] > ratings[i - 1]){
                candy[i] = candy[i - 1] + 1;
            }else{
                candy[i] = 1;
            }
        }
        // candy[n - 1] = 1;
        for(int i = n - 2; i >= 0; i--){        // 从右往左开始遍历
            if(ratings[i] > ratings[i + 1]){
                candy[i] = max(candy[i], candy[i + 1] + 1);
            }
        }
        int res = 0;
        for(int i = 0; i < n; i++){
            res += candy[i];
        }
        return res;
    }
};

四. 总结

本题理解起来很简单,但是真正做起来并不简单,需要将思路梳理好,只要多做就能理解,加油!!!

时间复杂度:O(n);

空间复杂度:O(n)。

喜欢的话给个关注吧!!

相关推荐
2401_841495646 分钟前
【自然语言处理】中文 n-gram 词模型
人工智能·python·算法·自然语言处理·n-gram·中文文本生成模型·kneser-ney平滑
San3027 分钟前
从零到一:彻底搞定面试高频算法——“列表转树”与“爬楼梯”全解析
javascript·算法·面试
F_D_Z33 分钟前
最长连续序列(Longest Consecutive Sequence)
数据结构·算法·leetcode
ss27334 分钟前
Java并发编程:DelayQueue延迟订单系统
java·python·算法
SHERlocked9336 分钟前
摄像头 RTSP 流视频多路实时监控解决方案实践
c++·后端·音视频开发
JHC00000036 分钟前
118. 杨辉三角
python·算法·面试
WolfGang0073211 小时前
代码随想录算法训练营Day50 | 拓扑排序、dijkstra(朴素版)
数据结构·算法
业精于勤的牙1 小时前
浅谈:算法中的斐波那契数(四)
算法
一直都在5721 小时前
数据结构入门:二叉排序树的删除算法
数据结构·算法
白云千载尽1 小时前
ego_planner算法的仿真环境(主要是ros)-算法的解耦实现.
算法·无人机·规划算法·后端优化·ego·ego_planner