20210601 每日一题 你能在你最喜欢的那天吃到你最喜欢的糖果吗?

题目

题目链接

代码

class Solution {
public:
    vector<bool> canEat(vector<int>& candiesCount, vector<vector<int>>& queries) {

    }
};

方法一:前缀和

分析

每天吃糖果的落在区间:
[ 1 , d a i l y C a p ] [1, dailyCap] [1,dailyCap] 因此在favoriteDay天(从0天开始)吃的糖果的数量落在区间:
[ f a v o r i t e D a y + 1 , ( f a v o r i t e D a y + 1 ) × d a i l y C a p ] [favoriteDay+1, (favoriteDay+1)×dailyCap] [favoriteDay+1,(favoriteDay+1)×dailyCap] 由于要吃到第favoriteType类糖果,必须吃完前面所用favoriteType-1类糖果,因此第favoriteType类糖果落在区间:
[ s u m [ f a v o r i t e T y p e − 1 ] + 1 , s u m [ f a v o r i t e T y p e ] ] [sum[favoriteType−1]+1,sum[favoriteType]] [sum[favoriteType1]+1,sum[favoriteType]]
最后判断两个集合是否有交集即可,当两个集合没有交集时:
s u m [ f a v o r i t e T y p e ] < f a v o r i t e D a y + 1   o r   ( f a v o r i t e D a y + 1 ) × d a i l y C a p < s u m [ f a v o r i t e T y p e − 1 ] + 1 sum[favoriteType] < favoriteDay+1\ or\ (favoriteDay+1)×dailyCap < sum[favoriteType−1]+1 sum[favoriteType]<favoriteDay+1 or (favoriteDay+1)×dailyCap<sum[favoriteType1]+1

代码

class Solution {
public:
    vector<bool> canEat(vector<int>& candiesCount, vector<vector<int>>& queries) {
        int n = candiesCount.size();
        
        vector<long> sum(n);
        sum[0] = candiesCount[0];
        for (int i = 1; i < n; ++i) {
            sum[i] = sum[i - 1] + candiesCount[i];
        }
        
        int q = queries.size();
        vector<bool> ans (q);
        for (int i = 0; i < q; ++i) {
            int favoriteType = queries[i][0], favoriteDay = queries[i][1], dailyCap = queries[i][2];
            long x1 = favoriteDay + 1;
            long x2 = (favoriteType == 0 ? 1 : sum[favoriteType - 1] + 1);
            long y1 = (long)(favoriteDay + 1) * dailyCap;
            long y2 = sum[favoriteType];
            ans[i] = !(x1 > y2 || y1 < x2);
        }
        return ans;
    }
};

要点

  • 当favoriteType为第0类糖果时,sum[favoriteType−1]+1应取0
  • 使用long替代int

复杂度分析

  • 时间复杂度: O ( n + q ) O(n+q) O(n+q),其中 n n n q q q 分别是数组 candiesCount 和 queries 的长度。
  • 空间复杂度: O ( n ) O(n) O(n)

拓展

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值