一、力扣题目:
二、理论分析
由于 天数是一天一天变化的,用 数组的下标代表天数i, 数组中的 数据代表知道秘密在第i天的人数
假设在某个人在知道秘密的第3天开始传播,在第6天忘记,由于 第1天1个人发现了秘密
spread为能传播秘密的人数,过去一天后,这个人为知道秘密的第二天
又过去一天,这个人为知道秘密的第三天,到了delay天,spread=1;向一个人传播
可以看出,知道秘密的人所在的天数在一步步后移,新增知道秘密的人不断出现在第一天,直到有一部分人到了第forget天
集体往后平移,到底forget天的人实际上就相当于出队了
假设要计算第六天知道秘密的人数,最终数组如下:
这时知道秘密的总人数为: day[1]+day[2]+...+day[forget-1]
三、代码实现
C语言代码实现如下:
//返回第n天知道秘密的人数
int KnowCnt(int n,int delay,int forget)
{
//假设第0天有一个人知道了秘密,delay代表从知道秘密那一天起作为第0天,0+delay天开始传播,到forget-1天最后一次传播
int*know=(int*)calloc(forget,sizeof(int));
know[0]=1;
int spread=0;//能传播的人数
for(int i=1;i<forget;i++)
{
//过去一天
for(int j=forget-1;j>0;j--)
know[j]=know[j-1];
//计算人数传播
for(int k=delay;k<forget;k++)
spread+=know[k];
//开始传播
know[0]=spread;
}
int res=0;
//计算知道秘密的人数
for(int i=0;i<forget;i++)
res+=know[i];
return res;
}