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