一、力扣题目:

二、理论分析
由于 天数是一天一天变化的,用 数组的下标代表天数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;
} 
                

















