代码随想录——贪心13.分发糖果
1.代码随想录-逆波兰式、滑动窗口最大值2.代码随想录-栈与队列-有效的括号(括号匹配)3.代码随想录——栈与队列8-前K个高频元素4.二叉树的递归遍历和迭代遍历5.代码随想录——二叉树-11.完全二叉树的节点个数6.代码随想录——二叉树-12.平衡二叉树7.代码随想录——二叉树17-路径总和8.代码随想录——二叉树19.最大二叉树9.代码随想录——二叉树21、合并二叉树(附:递归算法复杂度分析)10.代码随想录——二叉树23、验证二叉搜索树11.代码随想录——25二叉搜索树的最小绝对值差(递归遍历如何记录前后两个指针)12.代码随想录——25.二叉搜索树中的众数13.代码随想录——26、二叉(搜索)树的最近公共祖先14.代码随想录——回溯8、组合总和II15.代码随想录——回溯9.分割回文串16.代码随想录——回溯19重新安排行程17.代码随想录——回溯 N皇后18.代码随想录——贪心8.跳跃游戏II19.代码随想录——贪心9.K次取反后最大化的数组和 && std::sort函数的第三个参数说明
20.代码随想录——贪心13.分发糖果
21.代码随想录——贪心算法:根据身高重建队列 & Vector原理22.代码随想录——贪心算法22单调递增的数字23.代码随想录——贪心23监控二叉树24.代码随想录——动态规划5.周总结25.代码随想录——动态规划9不同的二叉搜索树26.代码随想录——动态规划01背包27.代码随想录——动态规划13.分割等和子集28.代码随想录——动态规划14最后一块石头的重量II(01背包)29.动态规划——dp的含义归类(完全背包和01背包区别)30.动态规划——26单词拆分31.代码随想录——动态规划背包问题总结32.代码随想录——动态规划31打家劫舍III(树状DP)33.代码随想录——动态规划、股票问题34.代码随想录——单调栈35.回溯总结
思路
一开始受到“摆动序列”的影响画图,有想过从左往右遍历,if当前孩子大于左孩子就比左孩子大1,else if大于右孩子就比右孩子大1
这样能保证“相邻两个孩子评分更高的孩子会获得更多的糖果。”但是不能保证每个人至少有1个糖果。
于是又想从右向左遍历,对于糖果数小于1个的做处理,此时发现很难通过一次遍历处理好。于是只能看答案了。
答案直接指出问题:“这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,如果两边一起考虑一定会顾此失彼。”
正确方法:
- 从左向右遍历,只关注右边评分大于左边的情况
- 从右向左遍历,只关注左边评分大于右边的情况
但是为保证同时大于两边,取当前糖果数和第一次遍历得到的糖果数的最大值
因此通过两次局部最优,得到了全局最优
代码
class Solution {
public:
int candy(vector<int>& ratings) {
int sum=0;
vector<int> candy(ratings.size(),1);
for(int i=1;i<ratings.size();i++){
if(ratings[i] > ratings[i-1]){//当前孩子分数比左孩子大
candy[i] = candy[i-1] + 1;
}
}
for(int i=ratings.size()-2;i>-1;i--){
if(ratings[i] > ratings[i+1]){//当前孩子比右边大
candy[i] = max(candy[i+1]+1,candy[i]);//要同时满足比两边大,取max
}
}
for(int a:candy)sum+=a;
return sum;
}
};
合集:
代码随想录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现