• LeetCode第304场周赛


    LeetCode第304场周赛

    我总是不太聪明的样子,但是我总是想让自己变聪明的路上

    6132. 使数组中所有元素都等于零

    image-20220731104105441

    思路:

    1. 先对数组进行排序

    2. 找到题目中提到的x

    3. 如果排序后的最后一个元素为0,那么整个数组也就全为0了

    class Solution {
    public:
        int minimumOperations(vector& nums) {
            //每次减去x之后,重新排序,若最后一个元素为0即结束
            
            int res=0;
            int n=nums.size();
            int x=999;
            sort(nums.begin(),nums.end());
            while(nums[n-1]!=0){
                //找每一次的x
              for(int i=0;i0 &&nums[i]0){
                      nums[i]-=x;
                  }
              }
              //     for(int i=0;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    思路二:

    一次操作去掉一个非零值,需要几次操作能把数组中的所有元素转化为零
    本题可以转化为求数组中的不重复的非零元素的个数。

    class Solution {
    public:
        int minimumOperations(vector& nums) {
           unordered_set s;
            for(int num:nums){
                if(num>0){
                    s.insert(num);
                }
            }
            return s.size();
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    6133. 分组的最大数量

    image-20220731114843858

    思路:

    1. 学生总数一定是按照1,2,3…去进行划分
    2. 如果我把数组进行排序,优先选择最小的,那么肯定尽可能的得到更多的组数
    3. 对于题目第一个条件,按照递增数组的性质,一定是可以满足的

    image-20220731163942367

    image-20220731164203997

    class Solution {
    public:
        int maximumGroups(vector& grades) {
            int n=grades.size();
            return int(  ((sqrt(1+8*n)-1)/2) );
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    方法二:类似1

    直接按照分组条件2解决就行,即第1组1个人,第2组2个人,依次类推,最后一组不符合的算到前一组上。
    可以这样理解,把这些数据从小到大排序,示例[10,6,12,7,3,5]排序过后为[3,5,6,7,10,12],然后我们看,按照以1为差做等差,后一组的和一定是大于前一组的,所以我们需要关注的就只有所有数据按照条件2能分成几组了

    class Solution {
    public:
        int maximumGroups(vector& grades) {
            int n=grades.size();
            sort(grades.begin(),grades.end());
            int res=0;
            while(n-res>res){
                n-=res;
                res++;
            }
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6134. 找到离给定两个节点最近的节点

    image-20220731165020019

    思路:求出给出的两个点到每一个点的距离,取出其中一个点到相应点最大的,同时保证整体是最小的

    class Solution {
    public:
        int closestMeetingNode(vector& edges, int node1, int node2) {
            int n =edges.size();
             int dis_min=n;
             int ans =-1;
             auto cal_dis = [&](int x)->vector{
                 vector dist(n,n);
                 for(int d=0;x>=0&&dist[x]==n;x=edges[x]){
                     dist[x] =d++;
                    
                 }
                  return dist;
             };
             auto d1= cal_dis(node1);
             auto d2 =cal_dis(node2);
             for(int i=0;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    6135. 图中的最长环

    image-20220731165101941

    通过采用时间戳记录的方式

    class Solution {
    public:
        int longestCycle(vector& edges) {
            int n = edges.size(), time[n], ans = -1;
            memset(time,0,sizeof(time));
            //循环遍历每一个点,起始的时间戳为1
            for (int i = 0, clock = 1; i < n; ++i) {
                //如果该点已经被访问,跳过
                if(time[i])continue;
                //循环遍历当前结点相邻的结点
                for (int x = i, start_time = clock; x >= 0; x = edges[x]) {
                    // //如果该结点已经被访问
                    if(time[x]){
                        //看看当前的时间是否大于起始时候的时间
                        if(time[x]>=start_time)
                            //大于0,则说明找到一个环
                            ans = max(ans,clock-time[x]);
                        break;
                    }
                 
                     time[x] = clock++;
                }
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    总结:

    时隔两周,才把上上星期的周赛给补上。最主要的是后面两题,本想着刷完图再来补,后面也没有再去刷图了。于是乎就通过看题解来补上吧!本次周赛的后两题都是图论的题目!看了灵佬的解析,都有说到基环树这个知识点还没有看,准备这个星期给看了!

    题目我感觉好难!!!有点重创心灵。每次周赛要么一道题要么两道题!真的脑子不好用,转不过来,有时候看题解也不太理解。

    就给自己打打气吧!一步一个脚印,慢慢提高!

  • 相关阅读:
    esbuild中文文档-输出内容配置项(Output contents - Banner、Charset、Footer)
    多云管理平台发展的几个阶段
    QT中的线程池的介绍和使用
    汇集YOLO系列经典和前沿算法,实现高精度实时检测!
    部署springboot打包不打包配置文件,配置文件为外部配置文件使用 (真实场景)
    第 4 章 串(串的堆分配存储实现)
    mac电脑版矢量绘图推荐 Sketch for mac最新中文
    《淘宝电商业务场景》API接口教程获得淘口令真实url
    每隔一段时间自动敲键盘的的vbs脚本
    js函数变量提升理解
  • 原文地址:https://blog.csdn.net/qq_45353823/article/details/126281925