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

 

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