135. 分发糖果

贪心

import java.util.Arrays;

class Solution {
    public int candy(int[] ratings) {

        /**
         * 初始每个孩子一颗糖
         */
        int[] res = new int[ratings.length];
        Arrays.fill(res, 1);

        /**
         * 每个孩子都需要和自己左右的孩子进行比较来满足条件,但无法同时判断左右的大小
         * 只能先从左到右遍历,使得每个孩子的右孩子都满足条件,只要右边比左边大,右边的糖果等于左边 + 1
         * 然后从右到左遍历,使得每个孩子的左孩子满足条件,只要左边比右边大,左边的糖果应该取本身的糖果数(符合比它左边大) 和右边糖果数 + 1二者的最大值,这样才符合它比它左边的大,也比它右边大
         */
        for (int i = 1; i < ratings.length; i++) {

            if (ratings[i] > ratings[i - 1]){
                res[i] = res[i - 1] + 1;
            }
        }

        /**
         * 因为右孩子已经满足条件了,在判断左孩子时,要取res[i + 1] + 1和res[i]的最大值,保证第i个小孩的糖果数量既大于左边也大于右边
         */
        for (int i = ratings.length - 2; i >= 0; i--) {

            if (ratings[i] > ratings[i + 1]){
                res[i] = Math.max(res[i + 1] + 1, res[i]);
            }
        }

        return Arrays.stream(res).sum();
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/candy/

上一篇:史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等


下一篇:【面试常问】Redis的持久化机制是什么?各自的优缺点?