If we use brute force directly, get TLE.
we use 1d dp table, dp[i] means enter number from first day to i day we needed.
So how can we go to get to next room
two case:
First if nums[i] == i, that means we only need two days can go to i+1 room.
First time this room counter is odd, but we can go back room directly.
And Second day we can go to next room.
totally 2 days
Second case, if nums[i] != i, that means we will go to another room(nextVisit[i]) and go back to room(i)
the day we need is dp[i]- dp[nextVisit[i]]
so that if we need to from i to i+1
dp[i+1] = dp[i] + 2 + dp[i] — dp[nextVisit[i]]
annsert is dp[N — 1]
code:
class Solution {
public:
int firstDayBeenInAllRooms(vector<int>& nextVisit) {
vector<long> dp(nextVisit.size(), 0);
int mod = 1e9 + 7;
for(int i = 1; i < nextVisit.size();i++){
dp[i] = (dp[i - 1] + 2 + dp[i - 1] - dp[nextVisit[i -1]] + mod) % mod;
}
return dp.back();
}
};
Time Complexity: O(N)
Space Complexity: O(N)