【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;
    }
}
posted @ 2020-12-24 14:10  控球强迫症  阅读(144)  评论(0编辑  收藏  举报