例子给的误导人——有个要点是k天能不能重叠,以测试用例来说是可以的
实际上例子3应该再加一个
calories[1]+calories[2]=5=upper
不能重叠时,使用递归的解法(因为不能AC,所以不知道对不对,权当个思路)
public int dietPlanPerformance_2(int[] calories, int k, int lower, int upper) {
int n = calories.length;
return dietPlanPerformance(calories, k, lower, upper, 0, calories.length - 1, n);
}
private int dietPlanPerformance(int[] calories, int k, int lower, int upper, int i, int j, int n) {
if (i >= n)
return 0;
if (i + k - 1 >= n)
return 0;
if (j - i + 1 == k) {
int sum = 0;
for (; i <= j; i++) {
sum += calories[i];
}
if (sum < lower)
return -1;
else if (sum > upper)
return 1;
else {
return 0;
}
}
int sum1 = dietPlanPerformance(calories, k, lower, upper, i, i + k - 1, n);
int sum2 = dietPlanPerformance(calories, k, lower, upper, i + k, j, n);
return sum1 + sum2;
}
AC的写法
public int dietPlanPerformance(int[] calories, int k, int lower, int upper) {
int n = calories.length;
int sum = 0;
for (int i = 0; i < n; ++i) {
int point = getPoint(calories, k, lower, upper, i, n);
sum += point;
}
return sum;
}
private int getPoint(int[] calories, int k, int lower, int upper, int i, int n) {
if (i + k - 1 >= n)
return 0;
int sum = getSum(calories, k, i, n);
if (sum > upper)
return 1;
else if (sum < lower)
return -1;
return 0;
}
private int getSum(int[] calories, int k, int i, int n) {
int sum = 0;
for (int index = i; index < i + k; ++index) {
sum += calories[index];
}
return sum;
}