LeetCode第304场周赛
Posted William_Tao(攻城狮)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode第304场周赛相关的知识,希望对你有一定的参考价值。
文章目录
LeetCode第304场周赛
我总是不太聪明的样子,但是我总是想让自己变聪明的路上
6132. 使数组中所有元素都等于零
思路:
先对数组进行排序
找到题目中提到的x
如果排序后的最后一个元素为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,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场周赛的主要内容,如果未能解决你的问题,请参考以下文章