【LeetCode】Candy 解题报告

【题目】

There are N children standing in a line. Each child is assigned a rating value.

You are giving candies to these children subjected to the following requirements:

  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

What is the minimum candies you must give?

【题意】

多个小朋友站成一排,根据他们的得分分发糖果,得分高的小朋友要比旁边得分低的小朋友得到的糖果多,每个小朋友至少得到一枚糖果,问最少要准备多少糖果?

【思路】

先从左到右扫描一遍,使得右边比左边得分高的小朋友糖果数比左边多。

再从右到左扫描一遍,使得左边比右边得分高的小朋友糖果数比右边多。

【Java代码】

public class Solution {
    public int candy(int[] ratings) {
        int size = ratings.length;
        if (size == 0) return -1;
        if (size == 1) return 1;
        
        int[] cans = new int[size];
        cans[0] = 1;
        //正向扫描一遍,如果右边的rating比左边高,那么右边的糖果数就比左边多一个,否则只给一个糖果
        for (int i = 1; i < size; i++) {
            if (ratings[i] > ratings[i - 1]) cans[i] = cans[i - 1] + 1;
            else cans[i] = 1;
        }
        //反向扫描一遍,如果左边的rating比右边高,并且左边的糖果数比右边少,那么左边的糖果数应比右边多一
        for (int i = size - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1] && cans[i] <= cans[i + 1]) {
            	cans[i] = cans[i + 1] + 1;
            }
        }
        
        int ret = 0;
        for (int i = 0; i < size; i++) {
            ret += cans[i];
        }
        
        return ret;
    }
}

这个算法确实是自己想出来,后来发现网上也都是这么解的,确实感到很高兴。

思路虽然一下就想对了,但是提交了三四次才AC。首先是忘记判断 (size == 1) 的情况,其实是没有写 (ratings[i] > ratings[i + 1] && cans[i] <= cans[i + 1]) 的后半部分的判断,因为如果左边糖果数本身就已经比右边多了,那么改成 cans[i] = cans[i + 1] + 1; 就有可能把 cans[i] 变小。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值