OJ练习第155题——分发糖果

分发糖果

力扣链接:135. 分发糖果

题目描述

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

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

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

示例

OJ练习第155题——分发糖果_第1张图片

Java代码1(两次遍历)

官解这种方法要好理解一些。

class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        int[] left = new int[n];
        for (int i = 0; i < n; i++) {
            if (i > 0 && ratings[i] > ratings[i - 1]) {
                left[i] = left[i - 1] + 1;
            } else {
                left[i] = 1;
            }
        }
        int right = 0, ret = 0;
        for (int i = n - 1; i >= 0; i--) {
            if (i < n - 1 && ratings[i] > ratings[i + 1]) {
                right++;
            } else {
                right = 1;
            }
            ret += Math.max(left[i], right);
        }
        return ret;
    }
}

Java代码2(常数空间遍历)

OJ练习第155题——分发糖果_第2张图片

class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        int ret = 1;
        int inc = 1, dec = 0, pre = 1;
        for (int i = 1; i < n; i++) {
            if (ratings[i] >= ratings[i - 1]) {
                dec = 0;
                pre = ratings[i] == ratings[i - 1] ? 1 : pre + 1;
                ret += pre;
                inc = pre;
            } else {
                dec++;
                if (dec == inc) {
                    dec++;
                }
                ret += dec;
                pre = 1;
            }
        }
        return ret;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/candy/solutions/533150/fen-fa-tang-guo-by-leetcode-solution-f01p/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

失败代码

运行24/48,回头再来研究这种方法能不能行。和官解方法二同理。另外代码略显冗余。

class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        if(n == 1) return 1;

        int sum = n;

        int[] sub = new int[n];
        sub[0] = 0;
        int[] score = new int[n];
        score[0] = 0;

        for(int i = 1; i < n; i++) {
            sub[i] = ratings[i] - ratings[i - 1];
        }
        for(int i = 1; i < n; i++) {
            if((sub[i] > 0 && sub[i - 1] == 0) || (sub[i] > 0 && sub[i - 1] < 0) || (sub[i] < 0 && sub[i - 1] == 0) || (sub[i] < 0 && sub[i - 1] > 0)) {
                score[i] = 1;
            }
            if((sub[i] > 0 && sub[i - 1] > 0) || (sub[i] < 0 && sub[i - 1] < 0)) {
                score[i] = score[i - 1] + 1;
            }
            if(sub[i] == 0) score[i] = 0;
        }
        for(int i = 0; i < n; i++) {
            if(score[i] != 0) sum += score[i];
        }
        return sum;
    }
}

失败案例

知道为啥不通过,但是代码不知道怎么改
OJ练习第155题——分发糖果_第3张图片

你可能感兴趣的:(OJ练习,leetcode,java)