题解都在注释里,总的来说这是一道前缀和的题,在一个数组从i-j被重复计算的时候就要考虑用空间换时间,也就是前缀和。
class Solution {
public:
vector<bool> canEat(vector<int>& candiesCount, vector<vector<int>>& queries) {
//queries里每一个一维都是从第0天开始判断的,但是要把queries[i][0]前的糖果全吃完,但是你当前的吃糖能力是queries[i][2]
//不仅要考虑吃不到,也要考虑不够吃,比如一天吃一颗都不够吃
//这道题就是用queries[i][2]和1来计算最早和最晚吃到第i类糖果的时间,最后判断queries[i][1]是否在这个范围内即可
//防止每次都从candiescount[0]算到candiesCount[queries[i][0]],所以我们要用前缀和来记录0到i之前有几颗糖果
int m = candiesCount.size(), n = queries.size();
vector<bool> res(n);
vector<long> prefixSum(m+1);
prefixSum[0] = 0;
for(int i = 1; i <= m; ++i){
prefixSum[i] = prefixSum[i-1] + candiesCount[i-1];
}
for(int i = 0; i < n; ++i){
int t = queries[i][0], d = queries[i][1]+1, c = queries[i][2];
long minn = prefixSum[t]/c + 1, maxn = prefixSum[t+1];
res[i] = d >= minn && d <= maxn;
}
return res;
}
};