[LeetCode] 135. Candy java

    /**135. Candy
     * @param ratings
     * @return
     */
    public int candy(int[] ratings) {
        int len = ratings.length;
        if (len == 0)
            return 0;

        int[] left = new int[len];
        int[] right = new int[len];

        left[0] = 1;
        for (int i=1; i<len; i++) {
            if (ratings[i] > ratings[i-1])
                left[i] = left[i-1]+1;
            else
                left[i] = 1;
        }

        right[len-1] = left[len-1];
        for (int i=len-2; i>=0; i--) {
            if (ratings[i] > ratings[i+1]) 
                right[i] = right[i-1]+1;
            else 
                right[i] = 1;
        }

        int sum = 0;
        for (int i=0; i<len; i++) {
            sum += (left[i]>right[i])? left[i]: right[i];
        }
        return sum;
    }

这道题和Trapping water那个是一样的想法,因为无论是水坑还是得到糖的小朋友,影响因素都不只一边,都是左右两边的最小值/最大值来决定的。
所以这道题跟上一道一样,也是左右两边遍历数组。
left数组存从左边遍历,当前小朋友对比其左边小朋友,他能拿到糖的数量;
right数组存从右边遍历,当前小朋友对比其右边小朋友,他能拿到的糖的数量。
最后针对这两个数组,每个小朋友能拿到的糖的数量就是这两个数最大的那个数,求总加和就好了。

稍稍改进一下,在遍历right时直接求和

    public int candy(int[] ratings) {
        int len = ratings.length;
        if (len == 0) {
            return 0;
        }
        int[] nums = new int[len];
        nums[0] = 1;
        for (int i = 1; i < len; i++) {
            if(ratings[i] > ratings[i-1]) {
                nums[i] = nums[i-1] + 1;
            } else {
                nums[i] = 1;
            }
        }
        int res = nums[len-1];
        for (int i = len-2; i >= 0; i--) {
            int cur = 1;  
            if(ratings[i]>ratings[i+1])  
            {  
                cur = nums[i+1]+1;  
            }  
            res += Math.max(cur,nums[i]);  
            nums[i] = cur; 
        }
        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值