leetcode-135-candy(分發糖果)

leetcode-135 candy(分發糖果)

題目:

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

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

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

示例 1:leetcode

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

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

思路:

首先讀完題目能夠知道有兩點要知足的是:
1.每一個孩子至少有一顆糖果,就是說默認至少糖果數是等於孩子個數的
2.相鄰的孩子評分高的糖果也要多,因此評分有不等於的關係時,分數高的糖果數多,同時也能夠得出評分相同時,糖果數沒有影響,大於小於等於都有可能
一開始個人想法是相鄰的兩個孩子評分比較,只要有不等於關係糖果就加一,最後在加上默認每一個孩子的一個糖果(也就是孩子個數).這樣會產生兩個問題
一個是1,2,1這樣對稱的評分會多加出來一顆糖果,第二個是分數有遞增和遞減(這裏的遞增遞減指的是分數的大小是增長的仍是減小的)混合在一塊兒的時候吧,沒法肯定遞減的糖果數是多少,好比1,2,6,4,2,1. 前三個會推出來糖果數1,2,3可是第四個孩子的糖果數其實會依賴於他後面孩子的分數. 因此我最後是採用的遍歷兩次的方式,從左至右,在從右至左遍歷一次.從左至右只算遞增的,右邊的大於左邊的,就右邊的糖果數等於左邊的糖果數加一,若是不是遞增關係就默認爲1. 看上面1,2,6,4,2,1的例子遍歷一遍就是1,2,3,1,1,1.前三個知足遞增關係因此是1,2,3,後三個不知足因此默認是1. 再從右往左遍歷的時候遞減的時候(就是左邊的評分小於右邊的評分)不須要加上,第一遍遍歷的時候右邊糖果數已是大於左邊的糖果數. 從右往左遍歷1,2,6,4,2,1糖果數變爲1,2,3,3,2,1,由於3,3相等,因此左邊這個3會變爲4,最後是1,2,4,3,2,1.
最後把全部糖果數相加起來是13.function

代碼

public static int candy(int[] ratings) {
        int[] sumArr = new int[ratings.length];
        int sum = 0;
        sumArr[0] = 1;
        for (int i = 1; i < ratings.length; i++) {
            // 從左到右 右大於左 而且糖果數就加一
            if (ratings[i] > ratings[i - 1]) {
                sumArr[i] = sumArr[i - 1] + 1;
            } else {
                sumArr[i] = 1;
            }
        }

        for (int i = ratings.length - 1; i > 0; i--) {
            // 從右到作 左大於右 而且糖果數左邊小於右邊 就加一
            if (ratings[i - 1] > ratings[i] && sumArr[i - 1] <= sumArr[i]) {
                sumArr[i - 1] = sumArr[i] + 1;
            }
        }
        for (int item : sumArr) {
            sum += item;
        }
        return sum;
    }
複製代碼
相關文章
相關標籤/搜索