• 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 };
  • 相关阅读:
    在winfrom下利用c#代码,实现kindEditor的JavaScript方法:editor.html(),实现上报窗体的自动提交。
    Alwayson辅助副本上如何创建同步账号
    AD重建DNS
    SQL 删除用户的时候,产生“数据库主体在该数据库中拥有架构,无法删除”的解决办法
    FSLOGIX 安装记录,组策略记录
    使用FSLOGIX 部署配置文件漫游,首次生成VHD ,注销后无法登录。The user profile failed to attach please contact support
    定制ESXi版本下载
    SQL Server 数据库添加AlwaysOn高可用自定义登陆用户的方法
    RabbitMQ删除队列不重启消费者,动态重启
    获取某一年的某一周的周一//周日的日期
  • 原文地址:https://www.cnblogs.com/zb121/p/12445366.html
Copyright © 2020-2023  润新知