lc 1997 访问完所有房间的第一天
- 0<= nextVisit[i] <= i
- 奇数次访问 i 号房间时回到nextVisit[i]号房间
- 偶数次时访问 (i + 1) mod n号房间
- 故当第一次访问i号房间时,前面的房间访问次数都是偶数次。
- 设f[i]是第一次到达第i号房的日期编号,
- 第一次到i号房间的日期编号【=】第一次到i-1号房间【+】1(从i-1到nextVisit[i]花费1天)【+】从nextVisit[i]到i-1号房间( f[i-1] - f[nextVisit[i-1]])【+】1(从i-1到i花费1天)
- 即 f[i] = f[i-1] + 1 + f[i-1] - f[nextVisit[i-1]] + 1 ;
理解不足
从nextVisit[i]到i-1号房间( f[i-1] - f[nextVisit[i-1]])
f[nextVisit[i-1]]使得nextVisit[i-1]前的访问次数变成偶数 -> 这是f[i-1]中的前面一个阶段
class Solution {
public int firstDayBeenInAllRooms(int[] nextVisit) {
int n = nextVisit.length;
long[] f = new long[n];
f[0] = 0;
int mod = (int)Math.pow(10,9)+7;
for (int i = 1; i < n; ++i) {
f[i] = (f[i - 1] + 1 + f[i - 1] - f[nextVisit[i - 1]] + 1 + mod) % mod;
}
return (int) f[n - 1];
}
}