LintCode 412: Candy

题目描述

N 个小孩站成一列。每个小孩有一个评级。

按照以下要求,给小孩分糖果:

  • 每个小孩至少得到一颗糖果。

  • 评级越高的小孩可以得到更多的糖果。

需最少准备多少糖果?

样例

给定评级 = [1, 2], 返回 3.

给定评级 = [1, 1, 1], 返回 3.

给定评级 = [1, 2, 2], 返回 4. ([1,2,1]).

Sat Feb 26 2017

思路

首先题目中的第三个样例一开始我想不明白为什么是那样,后来才发现,评级比两旁的小孩高的话,糖果肯定要比旁边的小孩多,但是评级与两旁的小孩一样的话,是可以比他们少的。

其次本题只需要从前往后以及从后往前遍历两次即可,只需要保证评级高得到多一个糖果,不需要保证评级相同也得到相同的糖果。

代码

// 分糖果
int candy(vector<int>& ratings)
{
int n = ratings.size(), ans = 0;;
vector<int> nums(n, 1);
for (int i = 0; i < n; ++i)
{
if (i > 0 && ratings[i] > ratings[i - 1] && nums[i] <= nums[i - 1])
nums[i] = nums[i - 1] + 1;
if (i + 1 < n && ratings[i] > ratings[i + 1] && nums[i] <= nums[i + 1])
nums[i] = nums[i + 1] + 1;
}
for (int i = n - 1; i >= 0; --i)
{
if (i > 0 && ratings[i] > ratings[i - 1] && nums[i] <= nums[i - 1])
nums[i] = nums[i - 1] + 1;
if (i + 1 < n && ratings[i] > ratings[i + 1] && nums[i] <= nums[i + 1])
nums[i] = nums[i + 1] + 1;
ans += nums[i];
}
return ans;
}
05-11 17:34