【LeetCode】135.分發糖果

題目鏈接

135. 分發糖果

題目描述

解題思路

貪心法

兩次貪心:從左到右進行貪心選擇,從右到左進行貪心選擇

題目中說到:相鄰的孩子中,評分高的孩子必須獲得更多的糖果。這裏的相鄰包含兩種情況:左相鄰和右相鄰,我們不能一次性把左相鄰和右相鄰通通考慮,這樣只會得不償失,我們採取的策略是分兩次考慮,所以可以把總的規則分爲左相鄰規則右相鄰規則,只要同時滿足左相鄰規則右相鄰規則,那就滿足了題目要求。

初始所有孩子的糖果數都爲1.
左相鄰規則:從左到右遍歷,if(rate[i] > rate[i-1]),索引爲i的孩子的糖果數目比索引爲i-1的孩子的糖果數+1,並用left數組記錄
右相鄰規則:從右到左遍歷,if(rate[i] > rate[i+1]),索引爲i的孩子的糖果數目比索引爲i+1的孩子的糖果數+1,並用right數組記錄
如何既滿足左相鄰又滿足右相鄰規則呢?
最終索引爲i的孩子擁有的糖果數目=Math.max(left[i],righy[i])

AC代碼

class Solution {
    public int candy(int[] ratings) {
        int left[] = new int[ratings.length];
        int right[] = new int[ratings.length];
        Arrays.fill(left,1);
        Arrays.fill(right,1);
        int ans = 0;
        for(int i = 1; i < ratings.length; i++){
            if(ratings[i] > ratings[i-1]) left[i] = left[i-1] + 1;
        }
        for(int i = ratings.length-2; i >= 0; i--){
            if(ratings[i] > ratings[i+1]) right[i] = right[i+1] + 1;
        }
        for(int i = 0; i < ratings.length; i++){
            ans += Math.max(left[i],right[i]);
        }
        return ans;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章