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
class Solution {
public:
int candy(vector& ratings) {
m_c = ratings.size();
std::vector
for (int i = 0; i < m_c; i++)
{
vValueIndexs.emplace_back(ratings[i], i);
}
sort(vValueIndexs.begin(), vValueIndexs.end());
vector vRet(m_c);
for (int j = 0; j < vValueIndexs.size(); j++)
{
const int iCur = vValueIndexs[j].first;
const int i = vValueIndexs[j].second;
int num = 1;
if ((i + 1 < m_c) && (ratings[i + 1] < iCur))
{
num = max(num, vRet[i + 1]+1);
}
if ((i > 0) && (ratings[i - 1] < iCur))
{
num = max(num, vRet[i - 1]+1);
}
vRet[i] = num;
}
return std::accumulate(vRet.begin(), vRet.end(), 0);
}
int m_c;
};
class Solution {
public:
int candy(vector& ratings) {
m_c = ratings.size();
std::vector
for (int i = 0; i < m_c; i++)
{
vValueIndexs.emplace_back(ratings[i], i);
}
sort(vValueIndexs.begin(), vValueIndexs.end());
vector vRet(m_c);
for (int j = 0; j < vValueIndexs.size(); j++)
{
const int iCur = vValueIndexs[j].first;
const int i = vValueIndexs[j].second;
int num = 1;
if ((i + 1 < m_c) && (ratings[i + 1] < iCur))
{
num = max(num, vRet[i + 1]+1);
}
if ((i > 0) && (ratings[i - 1] < iCur))
{
num = max(num, vRet[i - 1]+1);
}
vRet[i] = num;
}
return std::accumulate(vRet.begin(), vRet.end(), 0);
}
int m_c;
};
如果你觉得复杂,想从简单的算法开始,可以学习我的视频课程。
https://edu.csdn.net/course/detail/38771
我的其它课程
[https://edu.csdn.net/lecturer/6176]
(https://edu.csdn.net/lecturer/6176)
win7 VS2019 C++17
算法精讲《闻缺陷则喜算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653