思路
注意:要用到数组下标的地方,一定要考虑范围问题!溢出
比如n=1, 进入for循环(i>=2, dp[2])就访问不了
DP
class Solution {
public:
int fib(int n) {
// for循环i从2开始,如果n<=1而执行for,则dp[i]就会报错
if(n<=1)
return n;
const int MOD = 1000000007;
vector<int> dp(n+1);
dp[0] = 0;
dp[1] = 1;
for(int i =2; i<=n; i++)
dp[i] = (dp[i-1] + dp[i-2]) % MOD ;
return dp[n];
}
};
优化:不需要开辟一个n+1
大的数组,只需要维护两个值。
class Solution {
public:
int fib(int n) {
// for循环i从2开始,如果n<=1而执行for,则dp[i]就会报错
if(n<=1)
return n;
const int MOD = 1000000007;
int dp[2];
dp[0] = 0;
dp[1] = 1;
for(int i=2; i<=n; i++){
// dp[1]就是当前状态,dp[0]就是上一个状态
int sum = (dp[0] + dp[1])%MOD;
dp[0] = dp[1]; // 暂存上一个状态
dp[1] = sum; // 转移当前状态
}
return dp[1];
}
};