每日一题:是否可以在喜欢的日子吃到喜欢的类型糖果

每日一题

给你一个下标从 0 开始的正整数数组 candiesCount ,其中 candiesCount[i] 表示你拥有的第 i 类糖果的数目。同时给你一个二维数组 queries ,其中 queries[i] = [favoriteTypei, favoriteDayi, dailyCapi] 。

你按照如下规则进行一场游戏:

你从第 0 天开始吃糖果。
你在吃完 所有 第 i - 1 类糖果之前,不能 吃任何一颗第 i 类糖果。
在吃完所有糖果之前,你必须每天 至少 吃 一颗 糖果。
请你构建一个布尔型数组 answer ,满足 answer.length == queries.length 。answer[i] 为 true 的条件是:在每天吃 不超过 dailyCapi 颗糖果的前提下,你可以在第 favoriteDayi 天吃到第 favoriteTypei 类糖果;否则 answer[i] 为 false 。注意,只要满足上面 3 条规则中的第二条规则,你就可以在同一天吃不同类型的糖果。

请你返回得到的数组 answer 。

解题思路

首先从题目中得知有四个参数:candiesCount:每种类型糖果的个数,favoriteType:喜欢的类型,favoriteDayi:喜欢的日子,dailyCapi:每天最多能吃的数量。

当看懂了这四个参数,那么这个题就简单了,我的想法是如果天数大于喜欢糖果类型前的所有类型数量和(每天至少要吃1颗糖,所以天数不能够大于所有糖果的和,如果大于,说明喜欢的糖已经吃完了),或者每天吃最多数量的糖小于喜欢类型糖的总和(如果按照最大的吃法还小于总和,说明糖太多了,吃不到)

代码实现

class Solution {
    public boolean[] canEat(int[] candiesCount, int[][] queries) {
        int n = candiesCount.length;
        long[] sum = new long[n+1];
        for (int i = 1; i <= n; i++) {
            sum[i] = sum[i-1] + candiesCount[i-1];
        }

        boolean[] res = new boolean[queries.length];
        for (int i = 0; i < queries.length; i++) {
            int type = queries[i][0], day = queries[i][1], dailyCap = queries[i][2];
            // 需要吃的糖果的范围
            long min = sum[type]+1, max = sum[type+1];
            // 在第 day 天能够吃到的糖果的范围
            long left = day+1, right = (day + 1) * (long)dailyCap;
            if (right < min || left > max) {
                res[i] = false;
            } else {
                res[i] = true;
            }
        }
        return res;
    }
}
上一篇:遗传算法实例分析


下一篇:人工智能实验:动物专家系统python实现