135、【贪心算法】leetcode ——135. 分发糖果(多维度贪心)(C++版本)
2023-09-11 14:20:01 时间
题目描述
原题链接:135. 分发糖果
解题思路
因为本题的值与左右两侧都有关系,若一趟遍历一起考虑的话,很复杂。因此,分情况来遍历。
(1)左值小于右值
局部最优解: 右值比左值多一个。
全局最优解: 相邻孩子,评分高的右值比左值大。
(2)左值大于等于右值
局部最优解: 1)某个数比右侧值大,比左侧值小,则该值比右侧值多一个;2)某个数比右侧值大,比左侧值也大,则该值取比右侧多一个与比左侧值多一个之间的最大值。
全局最优解: 相邻孩子,评分高的左值比右值大,并且评分高的右值也比左值大。
对于2)
中情况,若出现[1,3,4,5,2]
,此时在5
这个位置上,它即比它的左值大,也比它的右值,若还按照右值加一的,那么会让5
对应的糖果数变为2,就会比4
对应的糖果树小,因此取右侧多一个与比左侧值多一个之间的最大值。
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candyVec(ratings.size(), 1);
// 左 < 右
for(int i = 1; i < ratings.size(); i++) {
if(ratings[i - 1] < ratings[i]) candyVec[i] = candyVec[i - 1] + 1;
}
// 左 > 右
for(int i = ratings.size() - 2; i >= 0; i--) {
// 当找到一个数即比左边大,右比右边大的话,取右边加一与左边值之间的最大值
if(ratings[i] > ratings[i + 1]) candyVec[i] = max(candyVec[i + 1] + 1, candyVec[i]);
}
int res = 0;
for(int i = 0; i < candyVec.size(); i++) res += candyVec[i];
return res;
}
};
参考文章:135. 分发糖果
相关文章
- 托管C++线程锁实现 c++11线程池
- [c++菜鸟]《Accelerate C++》读书笔记
- 06 C++ - 名字控制
- 【c++】:模拟实现STL模板中的string
- C++ 编码规范整理
- 199、【哈希表】leetcode ——6315. 统计范围内的元音字符串数(C++版本)
- 181、【动态规划】leetcode ——72. 编辑距离(C++版本)
- 165、【动态规划】leetcode ——337. 打家劫舍 III:记忆化递归+动态规划(C++版本)
- 143、【回溯算法】leetcode ——738. 单调递增的数字:暴力法+贪心法(C++版本)
- 129、【动态规划/贪心算法】leetcode ——53. 最大子数组和(C++版本)
- 127、【贪心算法】leetcode ——455. 分发饼干:DFS+双指针法(C++版本)
- 126、【回溯算法】leetcode ——332. 重新安排行程:回溯算法(C++版本)
- 125、【回溯算法】leetcode ——47.全排列 II:visited去重(C++版本)
- 121、【回溯算法】leetcode ——78. 子集(C++版本)
- 112、【树与二叉树】leetcode ——108. 将有序数组转换为二叉搜索树:二分查找树(C++版本)
- 111、【树与二叉树】leetcode ——669. 修剪二叉搜索树:递归法(C++版本)
- 109、【树与二叉树】leetcode ——701. 二叉搜索树中的插入操作:递归法+双指针迭代法(C++版本)
- 92、【树与二叉树】leetcode ——111. 二叉树的最小深度:层次遍历+先序DFS+后序DFS[子问题分解](C++版本)
- 75、【字符串】leetcode——541. 反转字符串 II(C++版本)
- 70、【哈希表】leetcode——1. 两数之和(C++版本)
- C++对象内存分布(3) - 菱形继承(virtual)