【LeetCode】Candy 解题报告
2014-09-04 22:46
351 查看
【题目】
There are N children standing in a line. Each child is assigned a rating value.
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.
What is the minimum candies you must give?
【题意】
多个小朋友站成一排,根据他们的得分分发糖果,得分高的小朋友要比旁边得分低的小朋友得到的糖果多,每个小朋友至少得到一枚糖果,问最少要准备多少糖果?
【思路】
先从左到右扫描一遍,使得右边比左边得分高的小朋友糖果数比左边多。
再从右到左扫描一遍,使得左边比右边得分高的小朋友糖果数比右边多。
【Java代码】
这个算法确实是自己想出来,后来发现网上也都是这么解的,确实感到很高兴。
思路虽然一下就想对了,但是提交了三四次才AC。首先是忘记判断 (size == 1) 的情况,其实是没有写 (ratings[i] > ratings[i + 1] && cans[i] <= cans[i + 1]) 的后半部分的判断,因为如果左边糖果数本身就已经比右边多了,那么改成 cans[i] = cans[i + 1] + 1; 就有可能把 cans[i] 变小。
There are N children standing in a line. Each child is assigned a rating value.
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.
What is the minimum candies you must give?
【题意】
多个小朋友站成一排,根据他们的得分分发糖果,得分高的小朋友要比旁边得分低的小朋友得到的糖果多,每个小朋友至少得到一枚糖果,问最少要准备多少糖果?
【思路】
先从左到右扫描一遍,使得右边比左边得分高的小朋友糖果数比左边多。
再从右到左扫描一遍,使得左边比右边得分高的小朋友糖果数比右边多。
【Java代码】
public class Solution { public int candy(int[] ratings) { int size = ratings.length; if (size == 0) return -1; if (size == 1) return 1; int[] cans = new int[size]; cans[0] = 1; //正向扫描一遍,如果右边的rating比左边高,那么右边的糖果数就比左边多一个,否则只给一个糖果 for (int i = 1; i < size; i++) { if (ratings[i] > ratings[i - 1]) cans[i] = cans[i - 1] + 1; else cans[i] = 1; } //反向扫描一遍,如果左边的rating比右边高,并且左边的糖果数比右边少,那么左边的糖果数应比右边多一 for (int i = size - 2; i >= 0; i--) { if (ratings[i] > ratings[i + 1] && cans[i] <= cans[i + 1]) { cans[i] = cans[i + 1] + 1; } } int ret = 0; for (int i = 0; i < size; i++) { ret += cans[i]; } return ret; } }
这个算法确实是自己想出来,后来发现网上也都是这么解的,确实感到很高兴。
思路虽然一下就想对了,但是提交了三四次才AC。首先是忘记判断 (size == 1) 的情况,其实是没有写 (ratings[i] > ratings[i + 1] && cans[i] <= cans[i + 1]) 的后半部分的判断,因为如果左边糖果数本身就已经比右边多了,那么改成 cans[i] = cans[i + 1] + 1; 就有可能把 cans[i] 变小。
相关文章推荐
- LeetCode: Candy 解题报告
- leetCode解题报告之Candy(简单回溯)
- [LeetCode]Candy, 解题报告
- LeetCode 解题报告 Candy
- Leetcode 135 Candy 解题报告
- LeetCode Word Break 解题报告
- [Leetcode] 283. Move Zeroes 解题报告
- [LeetCode]Distinct Subsequences,解题报告
- Leetcode Insertion Sort List 解题报告
- LeetCode-Add Two Numbers-解题报告
- Leetcode 415. Add Strings 字符串加法 解题报告
- LeetCode解题报告--4Sum
- [leetcode] 373. Find K Pairs with Smallest Sums 解题报告
- [Leetcode] 289. Game of Life 解题报告
- Leetcode Word Ladder II 解题报告
- 【LeetCode】609. Find Duplicate File in System 解题报告(Python)
- [leetcode] 337. House Robber III 解题报告
- [leetcode] 297. Serialize and Deserialize Binary Tree 解题报告
- [Leetcode] 157. Read N Characters Given Read4 解题报告
- [leetcode] 82. Remove Duplicates from Sorted List II 解题报告