LeetCode135 分发糖果

可以使用贪心算法解决该问题 思路很简单
定义两个数组 Left 和 Right
Left 数组 从前向后 遍历使其满足条件
Right数组 从后向前 遍历使其满足条件
然后取left 和 right 第 i 位最大的值
total += max(left[i],right[i]);
累加total即可
这种思路清晰代码明了 还有其他方法

public int candy(int[] ratings) {
        int total = 0;
        int size = ratings.length;
        int left[] = new int[size];
        int right[] = new int[size];
        left[0] = 1;
        right[size - 1] = 1;

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

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

        for (int i = 0; i < size; i++) {
            total += Math.max(left[i], right[i]);
        }

        return total;
    }

这种思想比较难理解 我也是写的时候知道啥意思 写完了也比较蒙

这个排列有个特点 不管是升序 1 , 2 , 3 还是降序降序分发的糖果数量都是递增的

1,2,3 和 3,2,1这个分发的糖果数量是一样的。

我们分为两种情况处理 递增 和 递减
递增 : 递增比较清晰 ratings[i + 1] 大于 ratings[i] 就递增长度个糖果 相等算在了递增里 就相当于一个新的递增开始
递减 : rathings[i + 1] 小于 rathings[i] 就发放递减长度减一的糖果 如果递减长度大于了递增长度 就要对 i 及其后续递减 都要额外发放一个糖果

为什么 递减需要 发放 长度减一个,递增却发放 长度个?

因为 从递增到递减过度时 【1,2,1】 2 -> 1,2处在递增队列中 所发糖果数量一定递减队列所发糖果数量 所以递减队列就可以少发一个糖果

为什么 递减长度大于递增长度后 所有递减的都要额外多发放一个?

因为 当递减长度大于递增长度后就打破了 递增队列中 所发糖果数量一定递减队列所发糖果数量 这个约定 所以就要额外多发一个

这种解法很有意思 能看懂最好 看不到第一种绝对足够了,面试也不会要求写出这种的。

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

你可能感兴趣的:(LeetCode135 分发糖果)