1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
思路:
这个题终于能独立想出思路了,就是计算不同类型糖果吃到之前需要吃多少前面的类型的糖果,就是计算前缀和。
举个例子,74538,前缀和为0 7 11 16 19 27,我们这里27是总的数量,是解决边界条件用的。
我们得到前缀和后就可以开始用queries的数据了,我们这里取出favoritetype,并加1,取出favoriteday+1,取出dailycap。为什么type要加1,因为我们判断能否吃到需要满足
pre[type-1]<daycap<pre[type],所以加1了,也可以不再取出来的时候加一,满足这个意思就行。day加1是因为我们的day是从第0天开始,所以例如2,就已经是第3天了。
那么目的也就明显了 我们只要pa判断在每天吃的数量为1到dailycap这个范围下,满不满足
pre[type-1]<daycap<pre[type]即可。
这里如下可能,每天吃1颗小于pre[type-1],吃cap颗大于pre[type-1]小于pre[type]
。每天吃一颗大于大于pre[type-1]小于pre[type]。吃一颗和吃cap颗都大于pre[type-1]小于pre[type]。吃一颗小于pre[type-1],吃cap颗大于pre[type]
上述可以统一为day*cap>pre[type],day<pre[type-1].
代码:
class Solution {
public:
vector<bool> canEat(vector<int>& candiesCount, vector<vector<int>>& queries) {
int n1 = candiesCount.size(), n2 = queries.size();
vector<bool> res(n2,false);
vector<long long> pre(n1+1,0);
for(int i=1;i<n1+1;++i){
pre[i] = pre[i-1]+candiesCount[i-1];
}
for(int i=0;i<n2;++i){
int type = queries[i][0]+1;
int day = queries[i][1]+1;
int cap = queries[i][2];
long long right = pre[type];
long long left = pre[type-1]/cap;
res[i] = (day<=right&&day>left);
}
return res;
}
};