# 2327. Number of People Aware of a Secret ###### tags: `Leetcode` `Medium` `Dynamic Programming` Link: https://leetcode.com/problems/number-of-people-aware-of-a-secret/description/ ## 思路 思路[参考](https://leetcode.com/problems/number-of-people-aware-of-a-secret/solutions/2229982/java-c-python-sliding-window-o-n-time-o-forget-space/) 难点在于如何定义dp[i] dp[i]表示在第i天发现secret的人 share表示当下有多少人可以share secret ## Code ### DP $O(n)$ $O(n)$ ```java= class Solution { public int peopleAwareOfSecret(int n, int delay, int forget) { long[] dp = new long[n+1]; dp[1] = 1; long share = 0; int mod = 1000000007; for(int i=2; i<=n; i++){ share = (share+dp[Math.max(i-delay, 0)]-dp[Math.max(i-forget, 0)]+mod)%mod; dp[i] = share; } long ans = 0; for(int i=n-forget+1; i<=n; i++){ ans = (ans+dp[i])%mod; } return (int)ans; } } ``` ### Rolling DP $O(n)$ $O(forget)$ ```java= class Solution { public int peopleAwareOfSecret(int n, int delay, int forget) { long[] dp = new long[forget]; dp[1] = 1; long share = 0; int mod = 1000000007; for(int i=2; i<=n; i++){ share = (share+dp[(i-delay+forget)%forget]-dp[i%forget]+mod)%mod; dp[i%forget] = share; } long ans = 0; for(int i=n-forget+1; i<=n; i++){ ans = (ans+dp[i%forget])%mod; } return (int)ans; } } ```