DAY38:贪心算法(六)分发糖果+柠檬水找零

文章讲述了如何解决两个算法问题:135.分发糖果,使用贪心策略,通过两次遍历确保每个孩子获得至少一个糖果且满足相邻孩子评分高者获得更多糖果的条件;860.柠檬水找零,同样运用贪心思想,优先使用面额小的零钱找零,保证每位顾客都能得到正确找零。这两个问题的关键在于理解和利用特定场景下的固定策略。
摘要由CSDN通过智能技术生成

135.分发糖果

  • 本题涉及到一个思想,就是处理好一边再处理另一边,不要两边想着一起兼顾。也就是说递增递减都要处理的情况,需要遍历两遍。后面还会有题目用到这个思路。

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

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

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

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

示例 1:

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

示例 2:

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

提示:

  • n == ratings.length
  • 1 <= n <= 2 * 10^4
  • 0 <= ratings[i] <= 2 * 10^4

思路

本题大致思路如下图所示。注意,因为只给出了两个条件,没有说数值相等的情况,因此数值相等,又没有比左右评分高的情况,只需要基础的1就可以了。

在这里插入图片描述
本题,因为是相邻的孩子作比较,我们需要同时考虑两边的情况,也就是考虑左边的小孩和右边的小孩。

这种需要同时考虑两边的情况,例如同时需要比较左边小孩+右边小孩,一定要先确定一边再确定另一边!也就是说需要把一边的情况全部确认完毕,再去确认另一边。两边一起比较一定会乱

每个小孩既要和左边比较,又要和右边比较,此时首先确定一边,也就是右边小孩>左边小孩的情况。左边小孩>右边的情况,我们先不管。

第一种情况:右>左

右孩子>左孩子的情况:

这种情况,首先考虑极端情况,也就是一路都是右边>左边。这样的话,糖果的数量是从左到右累积,因此遍历也需要从左往右遍历

在这里插入图片描述

//判断逻辑
if(rating[i]<rating[i+1]){
   
    candy[i+1]=candy[i]+1;
}

第二种情况:左>右(倒序遍历)

左孩子>右孩子的情况如图所示。注意,左>右这种情况需要从后往前遍历

原因是,由于本题相邻孩子评分更高会获得更多糖果,因此我们需要考虑极端情况,也就是一路上都是左>右的情况

如果一路上都是左>右的情况那么糖果的数目需要从后向前累积!也就是说,我们必须采用倒序遍历,才能接收到左孩子>右孩子的累积结果

在这里插入图片描述

两种情况的结果合并,通过取最大值

第二种情况还有一个需要注意的问题,就是到了第二种情况的时候,candy[i]已经有第一种情况的数值了。此时,为了满足既要比较左边,又要比较右边,需要对两个方法得到的candy[i]取最大值。取最值的逻辑如下图:

绿色字体是第二个例子中,以右>左规则来遍历的结果。由此可见需要的操作是取max值。

在这里插入图片描述

//判断逻辑
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值