87、★贪心-LeetCode-135.分发糖果-字节面试题

题目描述

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

来源:力扣(LeetCode)

思路

1)代码回想录,左右分别遍历的思想;手写出的贪心。

用一个数组记录每个位置的糖果数!感觉像动态规划

①正常的思路,就是左右都要比!

②累加的思想:比如 1 5 4 3 2 1

从右到左不是 i + 1 > i的比较,而是 i > i + 1的比较!进行累加

从左到右不是 i > i + 1的比较,而是 i + 1 > 1的比较!进行累加

代码

1)贪心:还是不能找出 贪心准确的定义!

class Solution {
    //只给了 评分的 数组,得到的结果是,需要准备的最少糖果数
    public int candy(int[] ratings) {
        int n = ratings.length;//最少要 这么多糖果
        int[] flag = new int[n];
        Arrays.fill(flag,1);
        //左到右,高的加一
        for(int i = 1;i <= n - 1;i++){
            if(ratings[i] - ratings[i - 1] > 0 && flag[i] <= flag[i - 1]){//等于0不用加
                flag[i] = flag[i - 1] + 1;//一定要比他大1;
            }
        }
        //从右到左判断
        for(int i = n - 2;i >= 0;i--){
            if(ratings[i] - ratings[i + 1] > 0 && flag[i] <= flag[i + 1]){
                flag[i] = flag[i + 1] + 1;
            }
        }
        //遍历 记录数组,累加
        int num = 0;
        for(int i = 0;i < n;i++){
            num += flag[i];
        }
        return num;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值