Leetcode——動態規劃candy

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;
  }
}

注意點
逆向思維的考慮,之前的思維太過死板。以後碰到這種相鄰的數組問題,可以考慮使用這樣兩頭遍歷的思路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章