#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";
}
135. 分发糖果
最新推荐文章于 2025-05-19 20:18:50 发布