5352. 生成每种字符都是奇数个的字符串
1 class Solution { 2 public: 3 string generateTheString(int n) { 4 string ans=""; 5 if(n%2==1){ 6 for(int i=0;i<n;i++){ 7 ans+='a'; 8 } 9 }else{ 10 for(int i=0;i<n-1;i++){ 11 ans+='a'; 12 } 13 ans+='b'; 14 } 15 return ans; 16 } 17 };
5353. 灯泡开关 III
解法一:找规律:当最大亮灯的位置与亮灯的数量相同的时候,那么亮起蓝灯:
1 class Solution { 2 public: 3 ///当开灯数与最大亮灯的位置相等的时候,那么灯就变成蓝色了 4 int numTimesAllBlue(vector<int>& light) { 5 int n=light.size(); 6 int max_num=0;//记录最大的亮的灯位置 7 int cnt=0;//记录亮灯的数量 8 int ans=0; 9 for(int i=0;i<n;i++){ 10 max_num=max(max_num,light[i]); 11 cnt++; 12 if(cnt==max_num){ 13 ans++; 14 } 15 } 16 return ans; 17 } 18 };
解法二:并查集:
1 const int maxn=5*1e4+100; 2 class Solution { 3 public: 4 int father[maxn]; 5 int find(int x){ 6 //return father[x]=(father[x]==x?x:find(father[x])); 7 while(father[x]!=x){ 8 x=father[x]; 9 } 10 return x; 11 } 12 //这里不需要写合并的函数,因为下面会有合并的,而且合并是从小到大的,即大的当父亲。。 13 int numTimesAllBlue(vector<int>& light) { 14 int n=light.size(); 15 int ans=0; 16 int op[n+1]; 17 for(int i=1;i<=n;i++){ 18 father[i]=i; 19 op[i]=0; 20 } 21 int cnt=0; 22 for(int i=0;i<n;i++){ 23 int num=light[i]; 24 op[num]=1; 25 26 if(num>1&&op[num-1])father[num-1]=num;//表示的是当前灯的前一个灯也是量的那么,将其合并到当前灯的队伍中。 27 if(num+1<=n&&op[num+1])father[num]=num+1;//将大的复制成其父亲 28 29 cnt++; 30 if(op[1]&&find(1)==cnt)ans++; 31 } 32 return ans; 33 } 34 };
5354. 通知所有员工所需的时间
1 const int maxn=1e5+50; 2 //vector<int>dist(maxn); 3 4 class Solution { 5 public: 6 7 int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) { 8 vector<int>dist(maxn,0); 9 vector<int>edge[maxn]; 10 int ans=0; 11 if(n<=1)return 0; 12 //层次遍历一下,完事: 13 14 //int n=manager.size(); 15 for(int i=0;i<n;i++){ 16 dist[i]=0; 17 if(manager[i]!=-1)edge[manager[i]].push_back(i); 18 } 19 queue<int>que; 20 que.push(headID); 21 while(!que.empty()){//BFS模板 22 int x=que.front(); 23 que.pop(); 24 ans=max(ans,dist[x]); 25 for(int i=0;i<edge[x].size();i++){ 26 int v=edge[x][i]; 27 dist[v]=dist[x]+informTime[x]; 28 que.push(v); 29 } 30 } 31 return ans; 32 } 33 };
5355. T 秒后青蛙的位置
1 const int maxn=1e4; 2 class Solution { 3 public: 4 double frogPosition(int n, vector<vector<int>>& edges, int t, int target) { 5 if(edges.size()==0)return 1.0; 6 vector<int>edge[maxn]; 7 double dist[maxn]; 8 int cnt[n+1][2]; 9 for(int i=1;i<=n;i++){ 10 dist[i]=0.0; 11 //cnt[i].clear(); 12 cnt[i][0]=0; 13 cnt[i][1]=0; 14 } 15 for(int i=0;i<edges.size();i++){ 16 if(edges[i][0]>edges[i][1])swap(edges[i][0],edges[i][1]); 17 edge[edges[i][0]].push_back(edges[i][1]); 18 //edge[edges[i][1]].push_back(edges[i][0]); 19 } 20 21 queue<int>que; 22 que.push(1); 23 dist[1]=1.0; 24 int start=0;int end=1; 25 int level=1; 26 while(!que.empty()){ 27 start++; 28 int min_num=level; 29 30 int x=que.front(); 31 que.pop(); 32 int num=edge[x].size(); 33 double percent=1.0/(double)num; 34 for(int i=0;i<num;i++){ 35 int v=edge[x][i]; 36 if(edge[v].size()==0)cnt[v][1]=1; 37 cnt[v][0]=min_num; 38 dist[v]=(double)percent*dist[x]; 39 que.push(v); 40 } 41 //cout<<level<<endl; 42 if(start==end){ 43 level++; 44 start=0; 45 end=que.size(); 46 } 47 } 48 //cout<<cnt[target][0]<<" "<<level<<" "<<cnt[target][1]<<endl; 49 if((cnt[target][1]==0&&t==cnt[target][0])||(cnt[target][1]&&t>=cnt[target][0])){ 50 // cout<<"ok"<<endl; 51 // cout<<dist[target]<<endl; 52 return dist[target]; 53 }else{ 54 return 0.0; 55 } 56 57 } 58 };