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

[差分数组]2327. 知道秘密的人数

2327. 知道秘密的人数

这个解决方案使用差分数组(Difference Array)高效地处理了区间修改问题,计算第 n天结束时知道秘密的人数。以下是代码的详细解释:

核心思路

  1. 1.​差分数组 diff​:
    • •用于记录每天知道秘密人数的变化量(增量或减量)。
    • •初始化:diff[1] = 1表示第 1 天新增 1 人(初始知道秘密的人),diff[2] = -1是为了在差分数组中标记区间结束(确保前缀和计算正确)。
  2. 2.​变量说明​:
    • know:记录当前第 i天结束时知道秘密的总人数(包括当天新增和之前未忘记的人)。
    • ans:累计最后 forget天内知道秘密的人数(即第 n天结束时未忘记的人)。
  3. 3.​处理逻辑​:
    • 遍历每一天 i(从 1 到 n):

      • 更新 know​:know = (know + diff[i]) % MOD,加上当天的变化量(新增或减少)。

      • 累加答案​:如果 i >= n - forget + 1,说明当前 know中的人在第 n天结束时未忘记,累加到 ans

      • 传播秘密​:当前 know中的人会在 i + delay天分享秘密,导致那天新增 know人,因此更新 diff[i + delay] += know

      • 忘记秘密​:当前 know中的人会在 i + forget天忘记,因此更新 diff[i + forget] -= know

    • 使用 min(i + delay, n + 1)min(i + forget, n + 1)确保不越界。

关键点解析

  • 差分数组的作用​:将区间修改(如多人同时分享或忘记)转换为两个端点的修改,时间复杂度从 O(n) 降为 O(1)。

  • know的含义​:表示第 i天结束时知道秘密的总人数,包括当天新增和之前未忘记的人。

  • 传播与忘记的时机​:

    • 分享:第 i天的人会在 i + delay天分享,导致那天新增 know人。

    • 忘记:第 i天的人会在 i + forget天忘记,导致那天减少 know人。

  • 答案计算​:最后 forget天(i >= n - forget + 1)的 know之和,因为这些人第 n天结束时未忘记。

示例说明

n = 6, delay = 2, forget = 4为例:

  • 第 1 天:know = 1(初始人),传播到第 3 天(diff[3] += 1),忘记在第 5 天(diff[5] -= 1)。

  • 第 2 天:know = 0(无变化)。

  • 第 3 天:know = 1(第 3 天新增),传播到第 5 天(diff[5] += 1),忘记在第 7 天(越界忽略)。

  • 第 4 天:know = 1(第 4 天新增),传播到第 6 天(diff[6] += 1),忘记在第 8 天(越界忽略)。

  • 第 5 天:know = 1(第 5 天新增),传播到第 7 天(越界),忘记在第 9 天(越界)。

  • 第 6 天:know = 2(第 6 天新增),传播和忘记越界。

  • 最后 forget天(第 3 到 6 天):ans = 1 + 1 + 1 + 2 = 5

复杂度

  • 时间复杂度​:O(n),遍历每一天,每次更新差分数组的端点。

  • 空间复杂度​:O(n),差分数组长度 n + 2

代码总结

class Solution:def peopleAwareOfSecret(self, n: int, delay: int, forget: int) -> int:MOD = 1000000007diff = [0] * (n + 2)  # 差分数组,长度 n+2 防越界diff[1] = 1  # 第 1 天新增 1 人diff[2] = -1  # 差分结束标记ans = 0know = 0  # 当前知道秘密的总人数for i in range(1, n + 1):  # 遍历每一天know = (know + diff[i]) % MOD  # 更新当前知道人数if i >= n - forget + 1:  # 最后 forget 天内的人未忘记ans = (ans + know) % MOD# 传播:当前 know 人会在 i+delay 天新增 know 人diff[min(i + delay, n + 1)] = (diff[min(i + delay, n + 1)] + know) % MOD# 忘记:当前 know 人会在 i+forget 天减少 know 人diff[min(i + forget, n + 1)] = (diff[min(i + forget, n + 1)] - know) % MODreturn ans % MOD

此方案高效利用差分数组处理动态区间修改,适用于大量区间操作的场景。


文章转载自:

http://cVBibD2C.kghhL.cn
http://j2HXwv9A.kghhL.cn
http://XpMV0YYA.kghhL.cn
http://EppuDA0q.kghhL.cn
http://BTmdmvZK.kghhL.cn
http://bbDzc0RX.kghhL.cn
http://bVkGz40S.kghhL.cn
http://aBJrrqjK.kghhL.cn
http://PLWDxdMh.kghhL.cn
http://O9aSmJBu.kghhL.cn
http://njq3qOK6.kghhL.cn
http://631xIiEF.kghhL.cn
http://O2TBpXF9.kghhL.cn
http://zYoU2siF.kghhL.cn
http://TQrORiAi.kghhL.cn
http://8GiA787g.kghhL.cn
http://7QqwWY2Q.kghhL.cn
http://hnG2OfOV.kghhL.cn
http://17ryYPtj.kghhL.cn
http://NHhB4Ixb.kghhL.cn
http://LsIwMMBR.kghhL.cn
http://Yez4Y23s.kghhL.cn
http://CLrtzANB.kghhL.cn
http://cIx89UDS.kghhL.cn
http://aQ4rpJgX.kghhL.cn
http://rHknuHYr.kghhL.cn
http://tv7N619T.kghhL.cn
http://LTOSX2lS.kghhL.cn
http://MpZ9hAW0.kghhL.cn
http://1kOFDSt0.kghhL.cn
http://www.dtcms.com/a/375161.html

相关文章:

  • 微调Qwen2.5模型的完整指南
  • SpringBoot之日志处理(logback和AOP记录操作日志)
  • DTO简单讲解
  • ERP和MES、WMS、CRM,到底怎么配合?
  • 【实战中提升自己】总部项目实施全方面总结
  • MS9127S USB投屏控制芯片(LVDS输出)
  • rook-ceph的osd块存储权重数据迁移脚本
  • 少儿编程C++快速教程之——3. 数组和矩阵操作
  • 【Kubernetes知识点】CRD客户资源定义及Gateway
  • 移动开发 - Uni-app跨端跨平台开发 - 学习/实践
  • 物联网时序数据管理的利器:为何IoTDB备受青睐?
  • 意识智能体:大模型的下一个进化方向?
  • 探索大模型的前沿:从GPT到LLAMA,看看AI如何改变世界
  • 西门子 S7-200 SMART 核心指令(布尔指令、传送指令、数学运算指令和比较指令)详解
  • llama-stack实战:Python构建Llama应用的可组合开发框架(8k星)
  • App Store 软件上架全流程详解,iOS 应用发布步骤、uni-app 打包上传与审核要点完整指南
  • Linux系统命令行git的使用
  • Ubuntu服务器安装fish-speech本地语音部署教程
  • Tomcat的基础使用
  • 无人机电压模块技术剖析
  • 无人机图传通信模组——16公里抗干扰稳定传输的高性能解决方案
  • 高效 P2P 文件传输工具:FileSync 利用 WebRTC 技术实现极速安全传输
  • UOS20系统安装与 SSH/XRDP 远程访问功能配置指南
  • Spark学习(python版本)
  • 【XR行业应用】XR+工业,从远程协助到数字孪生,如何颠覆制造业?
  • 将Varjo XR技术融入飞行模拟器,有效降低成本提升训练效果
  • 深入了解linux系统—— POSIX信号量
  • K8S集群管理(2)
  • 安装JUPYTERHUB - 不使用LINUX本地用户
  • 如何实现 Vuex 中的 Store 插件