leetcode 150: Candy


Candy

Total Accepted: 12328 Total Submissions: 68006

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?

public class Solution {
    public int candy(int[] ratings) {
        int len = ratings.length;
        if(len<1) return 0;
        int[] d = new int[len];
        
        d[0] = 1;
        
        for(int i=1; i<len; i++) {
            if(ratings[i] >ratings[i-1]) {
                d[i] = d[i-1] + 1;
            } else {
                d[i] = 1;
            }
        }
        
        int total = d[len-1];
        d[len-1] = 1;
        for(int i=len-2; i>=0; i--) {
            int cur = 1;
            if(ratings[i] > ratings[i+1]) {
                cur = d[i+1] + 1;
            } 
            total += Math.max(cur, d[i]);
            d[i] = cur;
        }
        return total;
    }
}



"这种两边扫描的方法是一种比较常用的技巧,LeetCode中 Trapping Rain Water和这道题都用到了,可以把这种方法作为自己思路的一部分,通常是要求的变量跟左右元素有关系的题目会用到哈。" [1]

如果从头开始找,然后每次都更新是很麻烦的。于是可以找到整个数列的波峰和波谷,每个波谷的都设为1,然后两边开始增加。但这样code社会会很复杂。[2]



Reference:

[1] http://blog.csdn.net/linhuanmars/article/details/21424783

[2] http://jane4532.blogspot.com/2013/10/candyleetcode.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值