leetcode周赛,leetcode周赛难度

  leetcode周赛,leetcode周赛难度

  609.知道秘密的人数第一天,一个人发现了一个秘密。

  给你一个整数延迟,意思是每个人在发现秘密后的延迟天数后,每天都会和一个新的人分享秘密。同时我给你一个整数锻炉,意思是大家发现秘密锻炉天后就忘了秘密。一个人不能在忘记秘密的当天和之后的日子里分享秘密。

  给你一个整数n,请返回第n天结束时知道秘密的人数。由于答案可能很大,请取109 ^ 7的余数返回。

  示例1:

  输入:n=6,延迟=2,忘记=4

  输出:5

  解释:

  第一天:假设第一个人的名字是a。(一个知道秘密的人)

  第二天:A是唯一知道这个秘密的人。(知道秘密的人)

  第三天:A和b分享这个秘密。(两个人都知道这个秘密)

  第四天:A和一个新的人c分享这个秘密。(三个人知道这个秘密)

  第五天:A忘记了这个秘密,B与一个新的人分享了这个秘密d .(三个人知道这个秘密)

  第六天:B和E分享秘密,C和f分享秘密。(五个人知道秘密)

  示例2:

  输入:n=4,延迟=1,忘记=3

  产出:6

  解释:

  第一天:第一个知道秘密的人是a。(一个知道秘密的人)

  第二天:A和b分享这个秘密。(两个人都知道这个秘密)

  第三天:A和B与两个新人C和d分享他们的秘密。(四个人知道这个秘密)

  第四天:A忘记了秘密,B、C、D分别与3个新人分享。(六个人知道这个秘密)

  提示:

  2=n=1000

  1=延迟忘记=n

  资料来源:LeetCode

  链接:3359leetcode.cn/problems/number-of-people-aware-of-a-secret

  版权归领网所有。商业转载请联系官方授权,非商业转载请注明出处。

  方案一:使用哈希表的实现思路:

  用哈希表存储第I天已知的人数,然后减去第I天遗忘的人数,再加上当天新增的人数。最后用哈希表存储当天新增人数,到第n天时退出循环。

  代码如下:

  类别解决方案{

  公共:

  int peopleawarofsecret(int n,int delay,int forget)

  {

  long mod=1e 9 7;

  std:unordered_map long,long m;//key==星期几,value==有多少人知道这一天?

  m[1]=1;

  long I=1;//哪天?

  长总计=1;

  while (i=n)

  {

  如果(我忘了)//那天被遗忘的人数

  {

  if (m.find(i - forget)!=m.end())

  {

  long v=m[I-forget];

  if(总v)

  {

  total=mod

  }

  total-=v;

  m . erase(I-forget);

  }

  }

  如果(我延迟)

  {

  今天长=0;//当天新增人数

  for(长k=I;k=i -忘记;- k)

  {

  中频(i - k延迟)

  {

  继续;

  }

  if (m.find(k)==m.end())

  {

  继续;

  }

  今天=m[k];

  }

  如果(今天0)

  {

  today %=mod

  total=(今日总计)% mod

  m[i]=今天;

  }

  }

  我;

  }

  返回总计% mod

  }

  };方法二:动态规划求解思路:

  定义dp[i]为第I天新加入的知道秘密的人数:dp[0]=0,dp[1]=1。状态转移方程:DP[I]=accumulate(DP(I-遗忘1),DP(I-延迟))-DP[I-遗忘],即第I天新增的人数。I-delay区间之和,再减去dp[i-forget](意思是这一天会忘记那么多人)。返回值:用一个塑料累计每天新增的人数,减去每天被遗忘的人数。代码省略。有兴趣可以看看其他解决方案~ ~

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: