题目描述
题目描述:
你的好友是一位健身爱好者。前段日子,他给自己制定了一份健身计划。现在想请你帮他评估一下这份计划是否合理。
他会有一份计划消耗的卡路里表,其中 calories[i] 给出了你的这位好友在第 i 天需要消耗的卡路里总量。
为了更好地评估这份计划,对于卡路里表中的每一天,你都需要计算他 「这一天以及之后的连续几天」 (共 k 天)内消耗的总卡路里 T:
如果 T < lower,那么这份计划相对糟糕,并失去 1 分;
如果 T > upper,那么这份计划相对优秀,并获得 1 分;
否则,这份计划普普通通,分值不做变动。
请返回统计完所有 calories.length 天后得到的总分作为评估结果。
注意:总分可能是负数。
示例 1:
输入:calories = [1,2,3,4,5], k = 1, lower = 3, upper = 3
输出:0
解释:calories[0], calories[1] < lower 而 calories[3], calories[4] > upper, 总分 = 0.
示例 2:
输入:calories = [3,2], k = 2, lower = 0, upper = 1
输出:1
解释:calories[0] + calories[1] > upper, 总分 = 1.
示例 3:
输入:calories = [6,5,0,0], k = 2, lower = 1, upper = 5
输出:0
解释:calories[0] + calories[1] > upper, calories[2] + calories[3] < lower, 总分 = 0.
提示:
1 <= k <= calories.length <= 10^5
0 <= calories[i] <= 20000
0 <= lower <= upper
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diet-plan-performance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
这是道简单题,上周周赛第二个,不过这道题是个典型的滑动窗口题,和上次组合数组中的所有的1很相似,所以拿来学习下滑动窗口的写法套路也挺好的。
题目要求很简单,k个一组作为一个窗口。
我们只需要取数组中前k个数作为第一个窗口,计算总和,之后遍历数组,遍历的同时计算积分。
每次滑动就是删掉窗口中的第一个数,同时在窗口末尾添加新的值,一直滑到数组末尾即可
具体代码
class Solution {
public:
int dietPlanPerformance(vector<int>& calories, int k, int lower, int upper) {
int res = 0;
int s = 0;
for(int i = 0; i < k - 1; i++) {
s += calories[i];
}
for(int i = k - 1; i < calories.size(); i++) {
s += calories[i];
if(s < lower) {
res--;
}
if(s > upper) {
res++;
}
s -= calories[i - k + 1];
}
return res;
}
};
最近做到一个简单的笔试题,求滑动窗口的最大值,写法和上面类似,就是向右滑动时依次记录最大值,我在下面贴下代码
#include<bits/stdc++.h>
using namespace std;
int a[10000];
int main() {
int n, k;
scanf("%d %d", &n, &k);
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int maxm = 0;
for(int i = 0; i < k - 1; i++) {
maxm += a[i];
}
int res = -100;
for(int i = k - 1; i < n; i++) {
maxm += a[i];
res = max(res, maxm);
maxm -= a[i - k + 1];
}
printf("%d\n", res);
return 0;
}
题目描述
- 质数排列
请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。
让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。
由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。
示例 1:
输入:n = 5
输出:12
解释:举个例子,[1,2,5,4,3] 是一个有效的排列,但 [5,2,3,4,1] 不是,因为在第二种情况里质数 5 被错误地放在索引为 1 的位置上。
示例 2:
输入:n = 100
输出:682289015
提示:
1 <= n <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/prime-arrangements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析:要求质数都得放在质数索引上
答案就是:质数个数的全排列 * 非质数个数的全排列(注意取模)
其实就是质数个数的阶乘 * 非质数个数的阶乘
class Solution {
public:
bool isprime(int n){
if(n<=1) return false;
for(int i=2;i*i<=n;i++){
if(n%i==0) return false;
}
return true;
}
long long fac(int n) {
long long res = 1;
int i = 1;
while(i <= n) {
res = i*res%1000000007;
i++;
}
return res % 1000000007;
}
int numPrimeArrangements(int n) {
int num1 = 0;
int num2 = 0;
for(int i = 1; i <= n; i++) {
if(isprime(i)) {
num1++;
} else {
num2++;
}
}
return fac(num1) * fac(num2) %1000000007;
}
};