LeetCode周赛252场:时隔半年再来练习
Posted 码不停Ti
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode周赛252场:时隔半年再来练习相关的知识,希望对你有一定的参考价值。
文章目录
先BB
有一段时间没有做算法题了,从准备春招开始就没有再 参加过 LeetCode 周赛 两三年前是能做对 两三道题,这些年过去了,还是这个水平 甚至还退步了不少。
仿佛还能想起刚开始接触 LeetCode 的时候 周赛还是用 iPad在 Java课上偷偷写 还只能做对 第一道签到题 第二题都不一定能写上。
那时候 参加的人比现在 少的多
还是自己太菜了,感觉身边的 同学 和 学弟学妹的水平 都是 AC 3 4 题了现在。
附上公司 休息室的工作环境
细心的同学会发现这个位置太晒了 我就换到了另一边
再说题
https://leetcode-cn.com/contest/weekly-contest-252/
1. 三除数
一个数 除数 肯定有 1 和 本身 第三个看看 2 到 sqrt(x) 有没有其他的
class Solution
public:
bool isThree(int n)
for(int i=2;i<=sqrt(n);i++)
if(i==sqrt(n))return true;
if(n%i==0)return false;
return false;
;
没啥限制 其实硬写 也可以
class Solution
public:
bool isThree(int n)
int r = 0;
for (int i = 1; i <= n; i += 1) if (n % i == 0) r += 1;
return r == 3;
;
2.你可以工作的最大周数
要求工作不能连续 所以 混着干活就行
1010101 这种 方式 最多的那个类型 比如是 1。最多就是 101 多1个就行
所以 拿到 全部数和 以及最大的数
class Solution
public:
long long numberOfWeeks(vector<int>& milestones)
long long int getmax = -1;
long long int sum=0;
for(int i=0;i<milestones.size();i++)
if(milestones[i]>getmax)getmax=milestones[i];
sum+=milestones[i];
if((sum-getmax)<getmax)return 2*(sum-getmax)+1;
return sum;
;
3.足够苹果最小花园长度
画图 找规律
我找了半天 分成 四份 算一份 *4
class Solution
public:
long long minimumPerimeter(long long neededApples)
long long ans = 0;
while(++ans)
long long int hang = (1+ans)*(ans)/2;
long long int pre= (ans+1)*hang + ans*(1+ans)*ans/2;
if(pre*4 >= neededApples)return ans*8;
;
在排行榜上 偷一份 别人的答案 看看
using LL = long long;
class Solution
public:
long long minimumPerimeter(long long neededApples)
LL L = 1, R = 1000000;
while (L < R)
LL M = (L + R) >> 1;
LL x = (1 + M) * M * (2 * M + 1) * 2;
if (x < neededApples) L = M + 1;
else R = M;
return L * 8;
;
4. 统计特殊子序列的数量
我没坐上来 说一下错误思路
就是 整3个数组 分别 扫描一轮后 统计
这个位置 前面0 的数量 前面 1 的数量 和 后面2 的数量
分成两组 一个1 和 多个1
第一组。一个1
扫到1 之后看前面 多少 0 后面多少 2 然后 组合
第二组 两个1 作为1 的边界
看 第一个1前面几个0 第二个1后面几个 2
组合 两个1 之间的1 和 前面的0 后面的2
超时+内存溢出了 还是看 正常其他人的解法吧🤪
using LL = long long;
constexpr LL mod = 1'000'000'007;
class Solution
public:
int countSpecialSubsequences(vector<int>& nums)
LL A = 0, B = 0, C = 0;
for (int x : nums)
if (x == 0) A = (A * 2 + 1) % mod;//A的组合个数有或无 2种 带不带前面的 + 现在的
if (x == 1) B = (B * 2 + A) % mod;//B的组合个数 带这个B 和 不带这个B 和 A后 带 B
if (x == 2) C = (C * 2 + B) % mod;//C的组合个数
return C;
;
以上是关于LeetCode周赛252场:时隔半年再来练习的主要内容,如果未能解决你的问题,请参考以下文章