首页 > 其他 > 详细

【LeetCode】135.分发糖果

时间:2020-12-24 17:01:04      阅读:24      评论:0      收藏:0      [点我收藏+]

题目链接

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;
    }
}

【LeetCode】135.分发糖果

原文:https://www.cnblogs.com/XDU-Lakers/p/14183772.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!