LeetCode 第179场周赛

5352. 生成每种字符都是奇数个的字符串

char * generateTheString(int n){
    char *s=(char*)malloc(sizeof(char)*(n+1));
    for(int i=0;i<n-1;i++)
        s[i]='a';
    if(n%2==0)
        s[n-1]='b';
    else
        s[n-1]='a';
    s[n]='\0';
    return s;
}

5353. 灯泡开关 III

【思路】从开始的一段灯泡如果都是打开状态,那么这一段灯泡就一定是全蓝色,我们记录这一段蓝色灯泡的最大下标maxblue,并且记录目前打开状态的最大灯泡编号maxopen。如果maxblue==maxopen。那么表示所有打开的灯泡都是蓝色状态。

int max(int a,int b){
    return a>b?a:b;
}

int numTimesAllBlue(int* light, int lightSize){
    int i,j,cnt=0,maxopen=0,maxblue=0;
    int lightnum[lightSize+2];
    memset(lightnum,0,sizeof(lightnum));
    for(i=0;i<lightSize;i++){
        lightnum[light[i]]=1;
        maxopen=max(light[i],maxopen);
        for(j=maxblue+1;j<=maxopen;j++){
            if(lightnum[j]==0){
                maxblue=j-1;break;
            }
            lightnum[j]=2;maxblue=j;
        }
        if(maxblue==maxopen)cnt++;
    }
    return cnt;
}

5354. 通知所有员工所需的时间

【思路】找到所有最末尾员工,从下往上遍历。这样的话,最末尾员工有几位就有几种可能的时间解,我们取最长的时间使得所有的员工都被通知到。

int max(int a,int b){
    return a>b?a:b;
}
int numOfMinutes(int n, int headID, int* manager, int managerSize, int* informTime, int informTimeSize){
    int i,time=0,father,maxtime=0;
    for(i=0;i<managerSize;i++){
        if(informTime[i]==0){//从叶节点往上遍历
            time=0;father=i;
            while(manager[father]!=-1){//直到根节点
                father=manager[father];
                time+=informTime[father];//记录这位员工到其直属上司的时间
            }
        }
        maxtime=max(maxtime,time);
    }
    return maxtime;
}

1377. T 秒后青蛙的位置

double dp[200][200];
typedef struct Node{
    int connect[200][200];
    int num[200];
}Node;
void dfs(int x,int f,int T,Node* tmp){//x代表当前所在节点,f代表x访问之前所在点
    int cnt=0,i;
    cnt=tmp->num[x];
    if(f>0)cnt--;
    //cnt代表x未访问过的子节点个数
    if(cnt==0){
        dp[x][T]+=dp[x][T-1];return;
    }
    for(i=0;i<tmp->num[x];i++){
        if(tmp->connect[x][i]==f)continue;//节点f是上次访问的点,虽然和x相连但是为已经访问过的点
        dp[tmp->connect[x][i]][T]+=1.0*dp[x][T-1]/cnt;
        dfs(tmp->connect[x][i],x,T,tmp);
    }
    return ;
}
double frogPosition(int n, int** edges, int edgesSize, int* edgesColSize, int t, int target){
    int i,j;
    Node *tmp=(Node*)malloc(sizeof(Node));
    for(i=1;i<=n;i++){
        tmp->num[i]=0;//初始化每个节点的子节点为0
        for(j=0;j<=t;j++)
            dp[i][j]=0;//初始化每个节点在任何时刻,青蛙所在的概率为0
    }
    dp[1][0]=1.0;//初始青蛙在节点1,因此青蛙0时刻在节点1的概率为1
    for(i=0;i<edgesSize;i++){//计算与每个节点相连的节点,保存起来
        tmp->connect[edges[i][0]][tmp->num[edges[i][0]]]=edges[i][1];
        tmp->num[edges[i][0]]++;
        tmp->connect[edges[i][1]][tmp->num[edges[i][1]]]=edges[i][0];
        tmp->num[edges[i][1]]++;
    }
    // for(i=1;i<=n;i++){
      //  for(j=0;j<tmp->num[i];j++)
      //      printf("i=%d %d \n",i,tmp->connect[i][j]);//当前节点可以达到的点
    //}
    for(i=1;i<=t;i++)
       dfs(1,0,i,tmp);
    return dp[target][t];
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章