LeetCode第304场周赛

Posted William_Tao(攻城狮)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode第304场周赛相关的知识,希望对你有一定的参考价值。

文章目录

LeetCode第304场周赛

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

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

思路:

  1. 先对数组进行排序

  2. 找到题目中提到的x

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

class Solution 
public:
    int minimumOperations(vector<int>& 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;i<n;i++)
              if(nums[i]>0 &&nums[i]<x)
                  x = nums[i];
              
          
            //每个元素减去x
            for(int i=0;i<n;i++)
              if(nums[i]>0)
                  nums[i]-=x;
              
          
          //     for(int i=0;i<n;i++)
          //      cout<<nums[i]<<": ";
          // 
            //cout<<endl;
            //对元素进行重新排序
        sort(nums.begin(),nums.end());
            res++;
            //重新记录x
            x=999;
        
        
        return res;
        
    
;

思路二:

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

class Solution 
public:
    int minimumOperations(vector<int>& nums) 
       unordered_set<int> s;
        for(int num:nums)
            if(num>0)
                s.insert(num);
            
        
        return s.size();
    
;

6133. 分组的最大数量

思路:

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

class Solution 
public:
    int maximumGroups(vector<int>& grades) 
        int n=grades.size();
        return int(  ((sqrt(1+8*n)-1)/2) );
    
;

方法二:类似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<int>& grades) 
        int n=grades.size();
        sort(grades.begin(),grades.end());
        int res=0;
        while(n-res>res)
            n-=res;
            res++;
        
        return res;
    
;

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

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

class Solution 
public:
    int closestMeetingNode(vector<int>& edges, int node1, int node2) 
        int n =edges.size();
         int dis_min=n;
         int ans =-1;
         auto cal_dis = [&](int x)->vector<int>
             vector<int> 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<n;i++)
             int d = max(d1[i],d2[i]);
             if(d<dis_min)
                 dis_min = d;
                 ans = i;
             
         
         return ans;
        
    
;

6135. 图中的最长环

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

class Solution 
public:
    int longestCycle(vector<int>& 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;
    
;

总结:

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

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

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

以上是关于LeetCode第304场周赛的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第304场周赛

解题报告力扣 第 272 场周赛

LeetCode第 303 场周赛

LeetCode第 303 场周赛

LeetCode第 303 场周赛

LeetCode第302场周赛