1、题目描述
2、解题思路
(下面的天数均为从 0 开始计算,比如第 0 天)
如果计算每一天所对应的 score ,都得计算包含当天在内往后连续 k 天的卡路里,存在相当的的重复计算。
比如:calories = [1,2,3,4,5],k = 3
计算第 0 天时,1+2+3 = 6
计算第 1 天时,2+3+4 = 9
这里的 2+3 就是重复计算。
为了避免重复计算,定义一个累积数组 accumulate[] 来保存累计值。
比如:accumulate[2] 表示0、1、2 共三天的卡路里累积值;accumulate[3] 表示0、1、2、3 共 4 天的卡路里累计值。
于是,当我需要计算第 4 天的连续 3 天的卡路里总量,计算的是4、5、6这三天,只需要:accumulate[6] - accumulate[3] 即可.
1、遍历 calories[] 数组,得到 accumulate[] 数组;
2、第 0 天的后 k 天卡路里总值为 accumulate[k-1] ,直接获取;第 n 天的后 k 天卡路里总值为 accumulate[n]-accumulate[n-k];
3、遍历每一天,比较 lower 和 upper 即可。
3、解题代码
class Solution {
public int dietPlanPerformance(int[] calories, int k, int lower, int upper) {
int days = calories.length;
int[] accumulate = new int[days]; // 第一天到第 n 天累计值
accumulate[0] = calories[0];
for (int i = 1; i < days; i++) {
accumulate[i] = accumulate[i - 1] + calories[i];
}
int calory;
int score = 0;
for (int i = k - 1; i < days; i++) {
if (i == k - 1) {
calory = accumulate[i];
}else {
calory = accumulate[i]-accumulate[i-k];
}
if (calory < lower) {
score--;
} else if (calory > upper) {
score++;
}
}
return score;
}
}