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?
知識點:
動態規劃
解題思路:
【個人思路】
首先要理解題意,有一羣小孩站成一行,每個小孩都有一個額定值,需要給這些小孩分配糖果,每個小孩至少有一個糖果,額定值比較高的小孩分得的糖果要比兩邊的小朋友的糖果多。其實一拿到題,我沒有往動態規劃上想,而是用最笨的方法來解決,遍歷每一個額定值然後和鄰居比較。這樣做的結果就是情況考慮不全通過率不高。
具體代碼:
package test;
import java.util.Random;
import javax.naming.spi.DirStateFactory.Result;
public class candy {
public static void main(String[] args){
int[] a={1,2};
int result;
result=candy(a);
System.out.println(result);
}
private static int candy(int[] ratings) {
// TODO Auto-generated method stub
int len=ratings.length;
int[] rate=new int[len];
int max=1;
int result = 0;
if(len==1) return 1;
for(int i=0;i<len;i++){
rate[i]=1;
}
for(int j=1;j<len-1;j++){
if(ratings[j]>=ratings[j-1]&&ratings[j]>=ratings[j+1]){
rate[j]=max+1;
max=rate[j];
}
}
if(ratings[0]>ratings[01]){
rate[0]=2;
}
if(ratings[len-1]>ratings[len-2]){
rate[len-1]=rate[len-2]+1;
}
for(int k=0;k<len;k++){
result+=rate[k];
}
return result;
}
}
運行結果:
【牛客思路】
看了人家的方法突然覺得自己的方法不是一點的笨,這樣比較使得好多情況考慮不到。牛客的思想是遍歷兩遍,首先從左到右遍歷一遍,當前點比前一個點高則比前者多一塊,先保證一個方向上滿足要求。第二遍從右到左遍歷一遍,按照同樣的方法進行遍歷。
具體代碼
package test;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import javax.naming.spi.DirStateFactory.Result;
public class candy_2 {
public static void main(String[] args){
int[] a={1,2};
int result;
result=candy(a);
System.out.println(result);
}
private static int candy(int[] ratings) {
// TODO Auto-generated method stub
int len=ratings.length;
if(ratings==null || len==0)
return 0;
int[] rate=new int[len];
int result=0;
Arrays.fill(rate, 1);
for(int i=1;i<len;i++){
if(ratings[i]>ratings[i-1]){
rate[i]=rate[i-1]+1;
}
}
for(int j=len-1;j>0;j--){
result+=rate[j];
if(ratings[j-1]>ratings[j]&&rate[j]>=rate[j-1]){
rate[j-1]=rate[j]+1;
}
}
result+=rate[0];
return result;
}
}
注意點
逆向思維的考慮,之前的思維太過死板。以後碰到這種相鄰的數組問題,可以考慮使用這樣兩頭遍歷的思路。