- 题目描述得非常麻烦,其实解题关键是以下两点,假设目标类型、目标日期、目标数量分别为 tp、day、num
- 每天吃 1 颗,不能在第 day 天之前吃完第 tp 种
- 每天吃 num 颗,不能到第 day 天还吃不到第 tp 种
impl Solution {
pub fn can_eat(candies_count: Vec<i32>, queries: Vec<Vec<i32>>) -> Vec<bool> {
let clen = candies_count.len();
// 先统计每种糖果之前的数量
// 因为最后涉及乘法,所以类型不能是 i32
// 最后需要匹配 tp 和 tp + 1,所以这里比 candies_count 多 1 位,减少一个 if 判断
let mut count_map: Vec<i64> = vec![0; clen + 1];
for i in 0..clen {
count_map[i + 1] = count_map[i] + candies_count[i] as i64;
}
// Vec::with_capacity 可以创建指定长度的空向量
let mut res: Vec<bool> = Vec::with_capacity(queries.len());
// 本来这里用了 .into_iter().map().collect(),但是效率比直接循环要低。
for v in queries {
let tp = v[0] as usize;
// 这里踩了坑,因为是从第 0 天开始吃的,所以日期需要 +1
let day = v[1] as i64 + 1;
let num = v[2] as i64;
res.push(day <= count_map[tp + 1] && day * num > count_map[tp]);
}
res
}
}
测试用例就不提供了,官方有一个超大的测试用例……