【Leetcode】135.分發糖果

# 題目java

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

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

每一個孩子至少分配到 1 個糖果。
相鄰的孩子中,評分高的孩子必須得到更多的糖果。
那麼這樣下來,老師至少須要準備多少顆糖果呢?spa

示例 1:code

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

示例 2:get

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

題解

  1. 咱們首先給每個小朋友都發糖果,保證每位喜至少分配到一個糖果;
  2. 從左到右遍歷,考慮右邊的小朋友比左邊小朋友排名高的狀況,此時更新爲 candy[i] = candy[i - 1] + 1,暫時不考慮左邊比右邊高的狀況;
  3. 從右到左遍歷,考慮左邊比右邊高的狀況,但願左邊比右邊高,可是又須要考慮不破壞第二點中的已經知足的規則,因此更新條件爲candy[i] = max(candy[i], candy[i + 1] + 1);
  4. 把全部的分配加起來;
class Solution {
    public int candy(int[] ratings) {
        if (ratings == null || ratings.length == 0) return 0;
        int[] resCandy = new int[ratings.length];
        for (int i = 0; i < resCandy.length; i++) {
            resCandy[i] = 1;
        }
        
        for (int i = 1; i < ratings.length; i++) {
            // 比左邊的小朋友排名更高.
            if (ratings[i] > ratings[i - 1]) {
                resCandy[i] = resCandy[i - 1] + 1;
            }
        }

        for (int i = ratings.length - 2; i >= 0; i--) {
            // 當前比右邊的小朋友排名更高.resCandy[i] = resCandy[i + 1] + 1
            // 同時須要保證不破壞當前比左邊小朋友高的規則
            if (ratings[i] > ratings[i + 1]) {
                resCandy[i] = Math.max(resCandy[i + 1] + 1, resCandy[i]);
            }
        }
        int res = 0;
        for (int i = 0; i < resCandy.length; i++) {
            res += resCandy[i];
        }
        return res;
    }
}

熱門閱讀

Leetcode

相關文章
相關標籤/搜索