一、题目
二、代码
class Solution
{
public:
//版本1.0 :遗憾的是 暴力解法失败了
//局部最优
//除了基本逻辑 我觉得 一轮一轮顺着发糖果效率更高 不用去找全局最小值
// int candy(vector<int>& ratings)
// {
// int i,j;
// vector<int> candys;
// int operation_flag=1;
// int return_num=0;
// if(ratings.size()==1) return_num=1;
// else
// {
// for(i=0;i<ratings.size();i++) candys.push_back(1); //第一轮保证每一个孩子至少有一个糖果
// //每一轮补发糖果 直到不再需要补发未知
// while(operation_flag)
// {
// operation_flag=0; //每一轮开始清零
// for(i=0;i<candys.size();i++) //补发糖果操作
// {
// if(i==0)
// {
// if(ratings[0]>ratings[1]&&candys[0]<=candys[1]) //评分高 糖果小于等于
// {
// candys[0]++;
// operation_flag=1;
// }
// }
// else if(i==candys.size()-1)
// {
// if(ratings[candys.size()-1]>ratings[candys.size()-2]&&candys[candys.size()-1]<=candys[candys.size()-2])
// {
// candys[candys.size()-1]++;
// operation_flag=1;
// }
// }
// else
// {
// if( (ratings[i]>ratings[i-1]&&candys[i]<=candys[i-1]) || (ratings[i]>ratings[i+1]&&candys[i]<=candys[i+1]) )
// {
// candys[i]++;
// operation_flag=1;
// }
// }
// }
// }
// for(i=0;i<candys.size();i++) return_num+=candys[i];
// }
// return return_num;
// }
//左边扫一次 右边扫一次
//核心:第二轮只是补充关系 不破坏稳定性
int candy(vector<int>& ratings)
{
int i,j;
int return_num=0;
vector<int> candys(ratings.size(),1);
//for(i=0;i<ratings.size();i++) candys.push_back(1);
for(i=1;i<candys.size();i++) //左侧
{
if(ratings[i]>ratings[i-1])
{
candys[i]=candys[i-1]+1;
}
}
for(i=candys.size()-2;i>=0;i--) //右侧
{
if(ratings[i]>ratings[i+1])
{
candys[i]=max(candys[i],candys[i+1]+1);
}
}
//for(i=0;i<candys.size();i++) std::cout<<" "<<candys[i];
//std::cout<<std::endl;
for(i=0;i<candys.size();i++) return_num+=candys[i];
return return_num;
}
};