Skip to main content

135. Candy

/*
* @lc app=leetcode id=135 lang=cpp
*
* [135] Candy
*
* https://leetcode.com/problems/candy/description/
*
* algorithms
* Hard (43.78%)
* Likes: 8018
* Dislikes: 683
* Total Accepted: 610.6K
* Total Submissions: 1.4M
* Testcase Example: '[1,0,2]'
*
* There are n children standing in a line. Each child is assigned a rating
* value given in the integer array ratings.
*
* You are giving candies to these children subjected to the following
* requirements:
*
*
* Each child must have at least one candy.
* Children with a higher rating get more candies than their neighbors.
*
*
* Return the minimum number of candies you need to have to distribute the
* candies to the children.
*
*
* Example 1:
*
*
* Input: ratings = [1,0,2]
* Output: 5
* Explanation: You can allocate to the first, second and third child with 2,
* 1, 2 candies respectively.
*
*
* Example 2:
*
*
* Input: ratings = [1,2,2]
* Output: 4
* Explanation: You can allocate to the first, second and third child with 1,
* 2, 1 candies respectively.
* The third child gets 1 candy because it satisfies the above two
* conditions.
*
*
*
* Constraints:
*
*
* n == ratings.length
* 1 <= n <= 2 * 10^4
* 0 <= ratings[i] <= 2 * 10^4
*
*
*/

// @lc code=start
class Solution {
public:
int candy(vector<int>& ratings)
{
int n = ratings.size();
vector<int> candy(n, 1);

for (int i = 1; i < n; ++i)
{
if (ratings[i] > ratings[i - 1])
{
candy[i] = candy[i - 1] + 1;
}
}

for (int i = n - 2; i >= 0; --i)
{
if (ratings[i] > ratings[i + 1])
{
candy[i] = max(candy[i], candy[i + 1] + 1);
}
}
return accumulate(candy.begin(), candy.end(), 0);
}
};
// @lc code=end
  • T: O(n)O(n)
  • S: O(n)O(n)