Leetcode - 135. 分发糖果

解题思路参考代码中的注释:
class Solution {

    // 参考:https://leetcode-cn.com/problems/candy/solution/candy-cong-zuo-zhi-you-cong-you-zhi-zuo-qu-zui-da-/
    // 以输入[1, 2, 0, 4, 5]为例,先给所有孩子都分一颗糖果
    // 然后从左往右遍历:
    //  - 第二个孩子得分比第一个孩子高,因此第二个孩子的糖果必须比第一个孩子多1个,即2个
    //  - 第三个孩子得分比第二个孩子低,因此第三个孩子仍然是1个糖果
    //  - 依次类推,第四、五个孩子的糖果数分别是2和3
    //  - 因此得到一个数组[1, 2, 1, 2, 3]
    // 再从右往左遍历:
    //  - 第四个孩子得分比第五个孩子低,因此第四个孩子仍然是1个糖果
    //  - 以此类推,最终得到另一个数组[1, 2, 1, 1, 1]
    // 然后合并两个数组,取相同下标的两个元素的最大值,该值即为对应的孩子应该得到的糖果数
    public int candy(int[] ratings) {
        int length = ratings.length;
        int[] l2r = new int[length], r2l = new int[length];

        // 从左往右遍历,如果当前孩子得分高于左边孩子,则当前孩子的糖果数是左边孩子糖果数加1,否则只得到1个
        l2r[0] = 1;
        for (int i = 1; i < length; i++) {
            l2r[i] = ratings[i] > ratings[i - 1] ? l2r[i - 1] + 1 : 1;
        }
        
        // 从右往左遍历,如果当前孩子得分高于右边孩子,则当前孩子的糖果数是右边孩子糖果数加1,否则只得到1个
        r2l[length - 1] = 1;
        for (int i = length - 2; i >= 0; i--) {
            r2l[i] = ratings[i] > ratings[i + 1] ? r2l[i + 1] + 1 : 1;
        }

        // Math.max(l2r[i], r2l[i])即为下标为i的孩子应该得到的糖果数
        int sum = 0;
        for (int i = 0; i < length; i++) {
            sum += Math.max(l2r[i], r2l[i]);
        }
        return sum;
    }
}
全部评论

相关推荐

零零幺零零幺:至少再做一个项目,然后猛投小厂,不然有点难
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务