楼主:
JIWP (JIWP)
2025-09-10 00:04:132327. Number of People Aware of a Secret
用一个矩阵A来记录第i天可以分享祕密的人
另一个矩阵B来记录第i天知道秘密的人
当A[i]>0, 表示会有A[i]个人在i+delay后能开始分享祕密
并在i+forget会忘记秘密
然后B[i]会等于前一天知道秘密的B[i-1]加上这一天能分享祕密的A[i]
最后回传B[n-1]就好
golang code :
func peopleAwareOfSecret(n int, delay int, forget int) int {
canShare, arr, mod := make([]int, n), make([]int, n), 1_000_000_007
if forget < n {
arr[forget], canShare[forget] = -1, -1
}
if delay < n {
canShare[delay] = 1
}
arr[0] = 1
for i := 1; i < n; i++ {
canShare[i] += canShare[i-1]
if i+forget < n && canShare[i] > 0 {
canShare[i+forget] = (canShare[i+forget] - canShare[i] + mod) % mod
arr[i+forget] = (arr[i+forget] - canShare[i] + mod) % mod
}
if i+delay < n && canShare[i] > 0 {
canShare[i+delay] = (canShare[i+delay] + canShare[i]) % mod
}
arr[i] = (arr[i] + arr[i-1] + canShare[i]) % mod
}
return arr[n-1] % mod
}