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;
}
【思路】從開始的一段燈泡如果都是打開狀態,那麼這一段燈泡就一定是全藍色,我們記錄這一段藍色燈泡的最大下標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;
}
【思路】找到所有最末尾員工,從下往上遍歷。這樣的話,最末尾員工有幾位就有幾種可能的時間解,我們取最長的時間使得所有的員工都被通知到。
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;
}
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];
}