题目
代码
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[favoriteType−1]+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[favoriteType−1]+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)