【LeetCode周赛】leetcode第252场周赛【试除法,贪心思维题,数学推公式,线性DP】
作者:
繁花似锦
,
2021-08-01 23:05:19
,
所有人可见
,
阅读 498
1. LeetCode 5830. 三除数
试除法求约数个数,$ O(\sqrt{n}) $
class Solution {
public:
bool isThree(int n) {
int cnt = 0;
for(int i = 1;i <= n / i;i ++ )
{
if(n % i == 0){
cnt ++;
if(i != n / i) cnt ++;
}
}
return cnt == 3;
}
};
2. LeetCode 5831. 你可以工作的最大周数
/*
思路:思维题
把最长项目longest看作1组,其余项目rest看作另一组
1. longest > rest + 1, 做不完,最大周数 = rest * 2 + 1;
2. else 做得完(插空法), 最大周数 = longest + rest
*/
class Solution {
public:
long long numberOfWeeks(vector<int>& milestones) {
long long sum = 0;
int longest = 0;
for(auto c : milestones){
longest = max(longest, c);
sum += c;
}
long long rest = sum - longest;
long long res;
if(longest > rest + 1){ // 最长项目比其余项目还长,做不完
res = rest * 2 + 1;
}else res = rest + longest; // 做得完
return res;
}
};
3. LeetCode 5187. 收集足够苹果的最小花园周长
数学推公式,二分查找,O(logn)
// 二分 + 等差数列
class Solution {
public:
// 最高x的三次方,所以10^15只需要x到10^5即可
long long calc(int x)
{
return 2LL*(2*x+1)*(1+x)*x;
}
long long minimumPerimeter(long long neededApples) {
int l = 0, r = 1e5;
while(l<r)
{
int mid = l + r >> 1;
long long zongshu = calc(mid);
if(zongshu >= neededApples) r = mid;
else l = mid + 1;
}
return 8*l;
}
};
// 作者:ZXREAPER
// 链接:https://leetcode-cn.com/problems/minimum-garden-perimeter-to-collect-enough-apples/solution/er-fen-deng-chai-shu-lie-ji-shu-5187-sho-8he1/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
4. LeetCode 5833. 统计特殊子序列的数目
线性DP
参考题解
题解
class Solution {
private:
static constexpr int mod = 1000000007;
public:
int countSpecialSubsequences(vector<int>& nums) {
int f0 = 0, f1 = 0, f2 = 0;
for (int num: nums) {
if (num == 0) {
f0 = (f0 * 2 + 1) % mod;
}
else if (num == 1) {
f1 = (f1 * 2 % mod + f0) % mod;
}
else {
f2 = (f2 * 2 % mod + f1) % mod;
}
}
return f2;
}
};
// 作者:LeetCode-Solution
// 链接:https://leetcode-cn.com/problems/count-number-of-special-subsequences/solution/tong-ji-te-shu-zi-xu-lie-de-shu-mu-by-le-bmq4/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。