【leetcode-135,62,63 動態規劃】分發糖果 ,不一樣路徑

分發糖果

老師想給孩子們分發糖果,有 N 個孩子站成了一條直線,老師會根據每一個孩子的表現,預先給他們評分。spa

你須要按照如下要求,幫助老師給這些孩子分發糖果:code

  • 每一個孩子至少分配到 1 個糖果。
  • 相鄰的孩子中,評分高的孩子必須得到更多的糖果。

那麼這樣下來,老師至少須要準備多少顆糖果呢?blog

示例 1:io

輸入: [1,0,2]
輸出: 5
解釋: 你能夠分別給這三個孩子分發 二、一、2 顆糖果。

示例 2:class

輸入: [1,2,2]
輸出: 4
解釋: 你能夠分別給這三個孩子分發 一、二、1 顆糖果。
     第三個孩子只獲得 1 顆糖果,這已知足上述兩個條件。



兩邊遍歷解法,感受不像動態規劃
 /*
  遍歷兩邊,首先每一個人得一塊糖,第一遍從左到右,若當前點比前一個點高就比前者多一塊。
  這樣保證了在一個方向上知足了要求。第二遍從右往左,若左右兩點,左側高於右側,但
  左側的糖果數很少於右側,則左側糖果數等於右側糖果數+1,這就保證了另外一個方向上知足要求
 */
連接:https://www.nowcoder.com/questionTerminal/74a62e876ec341de8ab5c8662e866aef
來源:牛客網

public class Solution {
    public int candy(int[] ratings) {
        if(ratings==null || ratings.length==0) {
            return 0;
        }
         
        int[] count = new int[ratings.length];
        //每一個孩子初始都有一個糖果
        Arrays.fill(count,1);
        int sum = 0;
        for(int i=1;i<ratings.length;i++) {
            if(ratings[i]>ratings[i-1]) {
                count[i] = count[i-1]+1;
            }
        }
         
        for(int i=ratings.length-1;i>0;i--) {
            sum+=count[i];
            if(ratings[i]<ratings[i-1] && count[i]>=count[i-1]) {
                count[i-1] = count[i]+1;
            }
        }
        sum+=count[0];
         
        return sum;
    }
}
相關文章
相關標籤/搜索