Leetcode 135 分发糖果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_zhuo_/article/details/88164728
class Solution {
public:
int candy(vector<int>& ratings) {
	int num = ratings.size();
	int sum = 0;
	vector<int> c; //c存取每个位置应该分发的糖果数
	int k,temp ;
	if (num == 0) return 0;
	if (num == 1) return 1;
        //学生 >1 人
	for (int i = 0, j = 0; i < num-1; i++)
	{
        //向前看
		if (i>0&&ratings[i] > ratings[i - 1]) k++;
		else k = 1;
        //向后看(判断有几个无需自增)
		j = i + 1;
		if (ratings[j - 1] > ratings[j] && k > 1)//已经大于左边,右边连续递减k-1时,k无需自增,多于k-1时,k需要开始自增
		{
			int m = j - 1;
			for (; m <num && m < j + k - 1; m++)
			{
				if (m+1>=num||ratings[m] <= ratings[m + 1]) break;//在向后看k-1个数过程中,控制条件为连续自减,出现后一个数大于等于前一个数时k无需再自增
			}
			if(m==j+k-1)j = m;//特别注意这里,如果k-1个数都满足条件,则是因为m>=j+k-1才跳出的循环,m=j+k-1;
			else j =m +1;//在if时就跳出了循环,m需要+1,走到第一个大于前面相邻数的位置
		}
        //向后看
		while (j<num&&ratings[j - 1] > ratings[j]) {
			k++;
			j++;
		}
		c.push_back(k);
		//cout <<i<<"   "<< ratings[i] << " : " << k << endl;
	}
    //最后一个位置糖果的设置
	if (ratings[num - 1] <= ratings[num - 2]) c.push_back(1);
	else c.push_back(k + 1);
	for (int i = 0; i < num; i++) sum += c[i];
	return sum;
}
};

猜你喜欢

转载自blog.csdn.net/Mr_zhuo_/article/details/88164728