# LC 135. Candy ### [Problem link](https://leetcode.com/problems/candy/) ###### tags: `leedcode` `python` `c++` `hard` `Greedy` There are <code>n</code> children standing in a line. Each child is assigned a rating value given in the integer array <code>ratings</code>. 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:** - <code>n == ratings.length</code> - <code>1 <= n <= 2 * 10<sup>4</sup></code> - <code>0 <= ratings[i] <= 2 * 10<sup>4</sup></code> ## Solution 1 - Greedy #### Python ```python= class Solution: def candy(self, ratings: List[int]) -> int: c = [1] * len(ratings) # Compare with the left child for i in range(1, len(ratings)): if ratings[i - 1] < ratings[i]: c[i] = c[i - 1] + 1 # Compare with the right child, then compare the size. for i in range(len(ratings) - 2, -1, -1): if ratings[i] > ratings[i + 1]: c[i] = max(c[i], c[i + 1] + 1) return sum(c) ``` #### C++ ```cpp= class Solution { public: int candy(vector<int>& ratings) { int n = ratings.size(); vector<int> cnt(n, 0); for (int i = 1; i < n; i++) { if (ratings[i] > ratings[i - 1]) { cnt[i] = cnt[i - 1] + 1; } } for (int i = n - 2; i >= 0; i--) { if (ratings[i] > ratings[i + 1]) { cnt[i] = max(cnt[i], cnt[i + 1] + 1); } } int res = accumulate(cnt.begin(), cnt.end(), 0) + n; return res; } }; ``` >### Complexity >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Solution 1 | O(n) | O(n) | ## Note sol1: 先從左遍歷到右, 再從右遍歷到左 [reference](https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0135.%E5%88%86%E5%8F%91%E7%B3%96%E6%9E%9C.md)