贪心day3

135. 分发糖果

class Solution {
    public int candy(int[] ratings) {
        int len = ratings.length;
        if (len == 0) return 0;
        //分配数组
        int[] alot = new int[len];
        //先从前到后 保证结点与左相邻孩子保持正确逻辑关系
        alot[0] = 1;
        for (int i = 1; i < len; i++) {
            if (ratings[i] > ratings[i - 1]) {
                alot[i] = alot[i - 1] + 1;
            } else {
                alot[i] = 1;
            }
        }
        //从后往前 保证结点与右结点保持正确逻辑关系
        for (int i = len - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1]) {
                //处理权重比右边大的情况 此时的alot[i]可能是由alot[i-1] + 1 得来(权重比左边大),需取alot[i]和alot[i+1] + 1中大的一个。
                //alot[i-1] > allot[i] > alot[i+1] 这种情况 在下一次循环中会处理保证该结点与左结点保持正确逻辑关系.
                alot[i] = Math.max(alot[i], alot[i + 1] + 1);
            }
        }
        int res = 0;
        for (int e : alot) {
            res += e;
        }
        
        return res;
    }
}

860. 柠檬水找零

class Solution {
    public boolean lemonadeChange(int[] bills) {
        //下标0 1 2 分别代表5 10美元数量 20不用计数 因为不能用来找零
        int[] dollars = new int[2];
        Arrays.fill(dollars, 0);
        for (int d : bills) {
            switch (d) {
                case 5:
                    dollars[0]++;
                    break;
                case 10:
                    dollars[1]++;
                    dollars[0]--;
                    break;
                case 20:
                    if (dollars[1] > 0) {
                        dollars[1]--;
                        dollars[0]--;
                    } else {
                        dollars[0] -= 3;
                    }
                    break;
                default:
                    //error mount of money
                    return false;
            }
            if (dollars[0] < 0) return false;
        }
        return true;
    }
}

参考:programmercarl.com

posted @ 2022-05-02 22:09  一梦两三年13  阅读(14)  评论(0)    收藏  举报
点击右上角即可分享
微信分享提示