前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?(前缀和)

LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?(前缀和)

作者头像
Michael阿明
发布2021-02-19 14:11:20
发布2021-02-19 14:11:20
34400
代码可运行
举报
运行总次数:0
代码可运行

文章目录

1. 题目

给你一个下标从 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 。

代码语言:javascript
代码运行次数:0
复制
示例 1:
输入:candiesCount = [7,4,5,3,8], queries = [[0,2,2],[4,2,4],[2,13,1000000000]]
输出:[true,false,true]
提示:
1- 在第 0 天吃 2 颗糖果(类型 0),第 1 天吃 2 颗糖果(类型 0),第 2 天你可以吃到类型 0 的糖果。
2- 每天你最多吃 4 颗糖果。即使第 0 天吃 4 颗糖果(类型 0),第 1 天吃 4 颗糖果(类型 0 和类型 1),你也没办法在第 2 天吃到类型 4 的糖果。换言之,你没法在每天吃 4 颗糖果的限制下在第 2 天吃到第 4 类糖果。
3- 如果你每天吃 1 颗糖果,你可以在第 13 天吃到类型 2 的糖果。

示例 2:
输入:candiesCount = [5,2,6,4,1], queries = [[3,1,2],[4,10,3],[3,10,100],[4,100,30],[1,3,1]]
输出:[false,true,true,false,false]
 
提示:
1 <= candiesCount.length <= 10^5
1 <= candiesCount[i] <= 10^5
1 <= queries.length <= 10^5
queries[i].length == 3
0 <= favoriteTypei < candiesCount.length
0 <= favoriteDayi <= 10^9
1 <= dailyCapi <= 10^9

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/can-you-eat-your-favorite-candy-on-your-favorite-day 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 见注释,前缀和思想
代码语言:javascript
代码运行次数:0
复制
class Solution {
public:
    vector<bool> canEat(vector<int>& candiesCount, vector<vector<int>>& q) {
        vector<long long> presum(candiesCount.size());
        for(int i = 0 ;i < candiesCount.size(); ++i)
            presum[i] = candiesCount[i];
        for(int i = 1; i < candiesCount.size(); i++) 
        {
            presum[i] += presum[i-1];//前缀和
        }
        int n = q.size();
        vector<bool> ans(n, false);
        for(int i = 0; i < n; i++)
        {
            int idx = q[i][0];// 要吃的类型
            int day = q[i][1];// 前面要吃多少天
            int eat = q[i][2];//每天最多吃多少
            long long l = (idx > 0 ? (presum[idx-1]+1) : 1), r = presum[idx];
            // l, r 需要吃到 [l, r] 这个范围内才行
            long long L = day*1LL+1, R = (day+1LL)*eat;
            // L, R 最少,最多能吃的范围
            // 两者有交集 即可
            if((l >= L && l <= R)||(r >= L && r <= R))
                ans[i] = true;
            else if((L >= l && L <= r)||(R >= l && R <= r))
                ans[i] = true;
        }
        return ans;
    }
};

372 ms 118.1 MB C++


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档