Link: https://oj.leetcode.com/problems/candy/
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?
我的思路:遍历两次数组。一次从左到右,保证ratings[i] > ratings[i-1]时, candy[i] = candy[i-1]+1;一次从右到左,保证ratings[i] > ratings[i+1]时, candy[i] = candy[i+1]+1
一次过,可以不再做。
Time: O(n), Space: O(n)
public class Solution {
public int candy(int[] ratings) {
int n = ratings.length;
int[] candies = new int[n];
for(int i = 0; i < n; i++){
candies[i] = 1;
}
for(int i = 1; i < n; i++){
if(ratings[i] > ratings[i-1]){
candies[i] = candies[i-1]+1;
}
}
int total = candies[n-1];
for(int i = n-2; i >=0; i--){
if(ratings[i] > ratings[i+1] && candies[i] <=candies[i+1]){
candies[i] = candies[i+1]+1;
}
total += candies[i];
}
return total;
}
}
我的代码在给candies赋值时又扫了一遍,Time = O(3n)。这步可以合并,变成O(2n)
public class Solution {
public int candy(int[] ratings) {
int n = ratings.length;
int[] candies = new int[n];
candies[0] = 1;//don't forget the case when n = 1
for(int i = 1; i < n; i++){
if(ratings[i] > ratings[i-1]){
candies[i] = candies[i-1]+1;
}
else{
candies[i] = 1;
}
}
int total = candies[n-1];
for(int i = n-2; i >=0; i--){
if(ratings[i] > ratings[i+1] && candies[i] <=candies[i+1]){
candies[i] = candies[i+1]+1;
}
total += candies[i];
}
return total;
}
}
这题为什么是DP?
相关题目:Trapping Rain Water