135. 分发糖果

#pragma once
/*
* 135. 分发糖果
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 

解题思路
但我们只需要简单的两次遍历即可:把所有孩子的糖果数初始化为 1;
先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的
糖果数加 1;再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数
不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加 1。通过这两次遍历,
分配的糖果就可以满足题目要求了。这里的贪心策略即为,在每次遍历中,只考虑并更新相邻一
侧的大小关系。

输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。

在样例中,我们初始化糖果分配为 [1,1,1],第一次遍历更新后的结果为 [1,1,2],第二次遍历
更新后的结果为 [2,1,2]

*/
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;


int candy(vector<int>& ratings) {
	int size = ratings.size();//获取vector类型的长度
	if (size < 2)
		return size;
	vector<int> num(size, 1);//[1,1,1],num的vector对象,并初始化了size个元素,每个元素的值为1。
	//从左向右循环
	for (int i = 1; i < size; ++i)//size = 3时循环2次
	{
		if (ratings[i] > ratings[i - 1]) {// ratings = [1,0,2]  
			num[i] = num[i - 1] + 1;//0 > 1==>false  num =  [1,1,1] ;2 > 1 ==> true  num = [1,1,2]
		}
	}
	//从右向左循环 size = 3
	for (int i = size - 1; i > 0; --i)// i = 2 ,1
	{
		if (ratings[i] < ratings[i - 1])// ratings = [1,0,2]
		{	// i =2,2 < 1 ==>false ;num = [1,1,2]
			//i = 1, 0 < 1==>true, num[0] = max(num[0]==>1,num[1]+1 ==>2)  ;
			//num[0] = 2 ==> num = [1,1,2]
			num[i - 1] = max(num[i - 1], num[i] + 1);
		}
	}

	for (auto vec:num) {
		std::cout << vec << " ";
	}
	return accumulate(num.begin(), num.end(), 0);//求和公式
}
void test_153()
{	
	vector<int> ival = { 1,2,1 };
	int val = candy(ival);
	cout << "最少的糖果数为:val=" << val << endl;
}
/*一  算法总结
* 第一步:先获取vector类型的长度,如果size<2,说明只有一个孩子的评分,则至少这个孩子分配一个糖果
* 第二步:若是size >= 2,先初始化一个size长度的数组,其值初始化为1
*		(1)从左开始向右遍历,i = 1; i < size -1;++i ;开始,当 ration[i] > ration [i-1]时,num[i] = num [i-1] +1 ;
*		(2)从右开始向左遍历,i = size -1; i >0 ;--i ;开始  当ration[i] > ration [i-1],num[i -1 ] = max(num[i-1],num[i]+1;
*		**(2)是重点,---> rations = [1,2,1]==> num = [1,2,1];  <--  1 < 2 num[1] = max(num[1] ,num[2] +1)==>需要重点理解这个
* 二 函数总结
* (1) ratings.size();//获取vector类型的长度
* (2) vector<int> num(size, 1);//[1,1,1],num的vector对象,并初始化了size个元素,每个元素的值为1。
* (3) max(num[i - 1], num[i] + 1); //求出多个数字中最大的一个
* (4) accumulate(num.begin(), num.end(), 0);//求和公式
*/

main.cpp


// leetcode.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "455.h"
#include "135.h"

int main()
{
    //test_455();
    test_153();
    //std::cout << "Hello World!\n";
}

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值