LintCode 412: Candy

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;
}
posted @ 2017-02-26 16:34  GenkunAbe  阅读(192)  评论(0编辑  收藏  举报