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 };
来源:https://www.cnblogs.com/zb121/p/12445366.html