斐波那契数列
描述:
写一个函数,输入 n
,求斐波那契(Fibonacci)数列的第 n
项(即 F(N)
)。
思路:
动规4步
(1)确定状态:最后一步,对于第n的数来说,就是前两个数之和
(2)转移方程:从2开始每个数都是前两个数之和
F[n]=F[n-1] + F[n-2]
(3)初始条件:0个数就是0,1是1(0和1没有前两个数)数组长度为n+1,(下标从0开始,考虑第n项,i<=n)
(4)计算顺序:每一步用前一步的值,所以从前往后
代码:
class Solution {
public int fib(int n) {
if(n == 0) return 0;
int[] arr = new int[n+1];
arr[0] = 0;
arr[1] = 1;
for(int i = 2; i <= n; i++){
arr[i] = arr[i-1] + arr[i-2];
arr[i] %= 1000000007;
}
return arr[n];
}
}
青蛙跳台阶
描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n
级的台阶总共有多少种跳法。
思路:
动规4步:
(1)确定状态:最后一步,两种情况,在前一阶一次跳一个,在前两阶一次跳两个
(2)转移方程:从第三阶开始每一阶都是上两阶跳法的和
F[i] = F[i-1] + F[i-2];
(3)初始条件:考虑第0台阶为1,第1个台阶是1.第2个台阶是2。
数组长度为n+1(数组充0开始,i代表第1台阶,n需要考虑,i<=n)
(4)计算顺序:每一阶都需要前面的结果,所以从前往后
代码:
class Solution {
public int numWays(int n) {
if(n == 0 || n == 1) return 1;
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= n; i++ ){
dp[i] = dp[i-1] + dp[i-2];
dp[i] %= 1000000007;
}
return dp[n];
}
}