当前位置: 首页 > news >正文

LeetCode 2327.知道秘密的人数:动态规划/差分数组O(n)

【LetMeFly】2327.知道秘密的人数:动态规划/差分数组O(n)

力扣题目链接:https://leetcode.cn/problems/number-of-people-aware-of-a-secret/

在第 1 天,有一个人发现了一个秘密。

给你一个整数 delay ,表示每个人会在发现秘密后的 delay 天之后,每天 给一个新的人 分享 秘密。同时给你一个整数 forget ,表示每个人在发现秘密 forget 天之后会 忘记 这个秘密。一个人 不能 在忘记秘密那一天及之后的日子里分享秘密。

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

 

示例 1:

输入:n = 6, delay = 2, forget = 4
输出:5
解释:
第 1 天:假设第一个人叫 A 。(一个人知道秘密)
第 2 天:A 是唯一一个知道秘密的人。(一个人知道秘密)
第 3 天:A 把秘密分享给 B 。(两个人知道秘密)
第 4 天:A 把秘密分享给一个新的人 C 。(三个人知道秘密)
第 5 天:A 忘记了秘密,B 把秘密分享给一个新的人 D 。(三个人知道秘密)
第 6 天:B 把秘密分享给 E,C 把秘密分享给 F 。(五个人知道秘密)

示例 2:

输入:n = 4, delay = 1, forget = 3
输出:6
解释:
第 1 天:第一个知道秘密的人为 A 。(一个人知道秘密)
第 2 天:A 把秘密分享给 B 。(两个人知道秘密)
第 3 天:A 和 B 把秘密分享给 2 个新的人 C 和 D 。(四个人知道秘密)
第 4 天:A 忘记了秘密,B、C、D 分别分享给 3 个新的人。(六个人知道秘密)

 

提示:

  • 2 <= n <= 1000
  • 1 <= delay < forget <= n

解题方法一:动态规划

(为了方便描述)也可以把这道题看成细菌繁殖,细菌delay天成熟forget天死亡并且期间每天复制自身一份。

dp[i]代表第i-1天新生细菌的数量,初始值dp[0]=1,其余dp[i]=0

从第1天开始遍历到第n天,第i天出生的细菌可以在第[i+delay, i+forget)天分别产下一个新细菌,所以有dp[i+j] += dp[i],其中i+delay<=j<i+forget

  • 时间复杂度O(n×(forget−delay))O(n\times(forget-delay))O(n×(forgetdelay))
  • 空间复杂度O(n)O(n)O(n)

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-09-09 23:42:14* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-09-09 23:52:39*/
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endifusing ll = long long;
const ll MOD = 1e9 + 7;
class Solution {
public:int peopleAwareOfSecret(int n, int delay, int forget) {vector<ll> dp(n);dp[0] = 1;for (int i = 0; i < n; i++) {for (int j = i + delay; j < i + forget && j < n; j++) {dp[j] = (dp[j] + dp[i]) % MOD;}}ll ans = 0;for (int i = 0; i < forget; i++) {ans = (ans + dp[n - i - 1]) % MOD;}return ans;}
};

解题方法二:查分数组

方法一中有一个耗时操作:对于第i天出生的细菌,令i+delayi+forget-1天的细菌分别加上dp[i]

这个耗时操作不正是差分数组可以优化的吗?

diff[i]=dp[i]-dp[i-1],想让dp[i+delay]dp[i+forget-1]每个加dp[i]只需要令diff[i+delay]+=dp[i]diff[i+forget]-=dp[i]

相应的,dp[i]就等于sum(diff[0..i+1])

  • 时间复杂度O(n)O(n)O(n)
  • 空间复杂度O(n)O(n)O(n)

AC代码

C++
C++
/** @Author: LetMeFly* @Date: 2025-09-09 23:42:14* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-09-11 10:49:54*/
using ll = long long;
const ll MOD = 1e9 + 7;
class Solution {
public:int peopleAwareOfSecret(int n, int delay, int forget) {vector<ll> diff(n + 1);diff[1] = 1;diff[2] = -1;ll now = 0, ans = 0;for (int i = 1; i <= n; i++) {now = (now + diff[i]) % MOD;if (i + forget > n) {ans = (ans + now) % MOD;}if (i + delay <= n) {diff[i + delay] = (diff[i + delay] + now) % MOD;}if (i + forget <= n) {diff[i + forget] = (diff[i + forget] + MOD - now) % MOD;}}return ans;}
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源


文章转载自:

http://nPmPps6X.qgqck.cn
http://A3r2T5EI.qgqck.cn
http://x5sS2n6p.qgqck.cn
http://ogUsM2Is.qgqck.cn
http://2jUWkFIX.qgqck.cn
http://l1DOoEu5.qgqck.cn
http://Fy7JdLsi.qgqck.cn
http://EP4qKZpx.qgqck.cn
http://5jf9QQma.qgqck.cn
http://ELUCeaWq.qgqck.cn
http://1LOLC6px.qgqck.cn
http://NVfwYCDe.qgqck.cn
http://4LzIV9LI.qgqck.cn
http://qE1PmyQz.qgqck.cn
http://pfvXHU3O.qgqck.cn
http://soZ2pjZG.qgqck.cn
http://rTUY5tDW.qgqck.cn
http://JZebI7bG.qgqck.cn
http://TTJSsMm8.qgqck.cn
http://y4amdlyt.qgqck.cn
http://c55OP3X7.qgqck.cn
http://F6TZ2irs.qgqck.cn
http://B1jhPUQ4.qgqck.cn
http://lXKVnm83.qgqck.cn
http://yKDX0Gqv.qgqck.cn
http://572gKWCZ.qgqck.cn
http://aWIlpGme.qgqck.cn
http://Q83gBgSc.qgqck.cn
http://8P8XlUFy.qgqck.cn
http://g0vmh4m3.qgqck.cn
http://www.dtcms.com/a/379548.html

相关文章:

  • 8年老测试分析,自动化测试的挑战与实施,一篇打通...
  • VBA即用型代码手册:另存为html文件SaveAs .Html File
  • 数字孪生:数据驱动下的虚实融合与技术落地方法论
  • 【前端Vue】el-dialog关闭后黑色遮罩依然存在如何解决?
  • 计算机视觉与模式识别前沿一览:2025年8月arXiv 热点研究趋势解析
  • 【Java】P1 Java由此开始:简介、下载安装与HelloJava
  • Katalog:AI语音文章播报工具,打造沉浸式听读体验
  • 细胞图像分割实战:用U-Net模型自动识别显微镜图像中的细胞
  • 如何理解MOS管规格书中标注的VDS?
  • JavaScript逆向SM国密算法
  • 炫彩VS动作指令:活体检测技术大比拼
  • 只读查询的“零分配”之路:EF Core + Dapper + MemoryPack 的组合优化
  • EMC电磁兼容进阶3讲培训:专题三 近场探头和频谱仪在EMC整改中的应用
  • 清理C盘回忆录
  • 对于单链表相关经典算法题:21. 合并两个有序链表及面试题 02.04. 分割链表的解析
  • 【代码随想录day 24】 力扣 78.集合
  • leetcode算法刷题的第三十二天
  • (done) CUDA 和 CPU 性能对比,矩阵加法和矩阵乘法对比
  • 事实上事实上
  • 【左程云算法07】队列和栈-链表数组实现
  • 关于亚马逊账号关联的思考——关于侵权
  • 【硬件-笔试面试题-84】硬件/电子工程师,笔试面试题(知识点:MOS管是损耗有哪些)
  • mybatis vs mybatis-plus
  • 网络诊断和通信中非常重要的工具或协议
  • Mysql主键选取
  • 蓝桥杯嵌入式
  • Python学习——字典和文件
  • urllib的使用
  • AFSim2.9.0学习笔记 —— 4.1、创建项目,以此项目介绍工作中Wizard使用(红方/蓝方武器平台、阵营、更换图标等,多图详细介绍)
  • 机器人驭风而行:低空经济如何开启智能新纪元【科普类】