LeetCode周赛152做题整理
做题时间:2019年9月3日
1 质数排列[⭐⭐]
这道题乍一看很简单,数据范围也很小,因此直接使用暴力法,首先找到n以内的质数的个数c,再分别将c和n-c的阶乘相乘即可:
#include <cmath>
...
return jc(c) * jc(n-c) % (pow(10, 9) + 7)
但是这样得不到正确答案,在学习了其他人的答案之后,我发现:这种需要对大数取模的问题需要在每一次相乘后都进行取模操作才能得到正确解,这一点要牢记了!具体见下面的代码。
class Solution {
public:
bool checkIsPrime(int k) {
int flag = true;
for (int j = 2; j < k; j++) {
if(k % j == 0) {
flag = false;
break;
}
}
return flag;
}
int numPrimeArrangements(int n) {
long ans = 1, c = 0, nc = 0;
for(int i = 1; i < n; i++) {
if(checkIsPrime(i + 1)) c++;
}
nc = n - c;
cout << c;
for(int i = 1; i <= c; i++) {
ans *= i;
ans %= 1000000007;
}
for(int i = 1; i <= nc; i++) {
ans *= i;
ans %= 1000000007;
}
return int(ans);
}
};
2 健身评估[⭐⭐]
这道题题意简单明了,思路也很清晰。然而,我使用的是笨方法,我用了两重循环,时间复杂度O(n*k),直接超时。因此这类题目需要使用累加的方法,能够在O(n)的时间复杂度内完成任务!
同时,在下面的代码中使用了vector的resize()方法,该方法能够指定vector的大小并且赋初始值,十分实用!
class Solution {
public:
int dietPlanPerformance(vector<int>& calories, int k, int lower, int upper) {
vector<int> sum;
int n = calories.size(), ans = 0;
sum.resize(n + 1, 0);
for(int i = 0; i < n; i++) {
sum[i + 1] = sum[i] + calories[i];
}
for(int i = 0; i < n - k + 1; i++) {
if (sum[i + k] - sum[i] > upper) ans++;
if (sum[i + k] - sum[i] < lower) ans--;
}
return ans;
}
};