LeetCode 179周赛题解

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 };

猜你喜欢

转载自www.cnblogs.com/zb121/p/12445366.html