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场:时隔半年再来练习的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode周赛252场:时隔半年再来练习

LeetCode 第252场周赛(贪心,平方和公式,子序列动态规划)

LeetCode第69场双周赛

LeetCode 第29场 双周赛 题目4 题解

佳期投资专场——第321场LeetCode周赛题解

Leetcode第52场双周赛总结+题解