【动态规划相关】LeetCode题目:斐波那契数列、爬楼梯
(一)爬楼梯
题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
提示:
1 <= n <= 45
题目分析(***)
(n个台阶)
1个台阶 :1种方法(一次走一个台阶)
2个台阶 :2种方法(连续两次走一个台阶 或 一次走两个台阶)
3个台阶:3种方法(大家注意昂,此处这三种方法是怎么得到的,并不是说你再像之前那样重新一个一个计算,而是这样,对于3个台阶这种情况,我们可以在上述2个台阶的基础上再走一步,或是在上述1个台阶的基础上再走两步,所以三个台阶这种情况的方法数量是基于上述一个台阶和两个台阶的基础上计算得来,即1 + 2 = 3)
4个台阶:5种方法(在2个台阶的基础上走两步 或 在3个台阶的基础上走一步, 即 2 + 3 = 5)
。。。
n个台阶 :num[n-2] + num[n-1] 种方法
代码实现如下
方法1:
public class Solution {
public int climbStairs(int n) {
//如果台阶数n小于2直接返回n即对应的方法数(其实这样做的目的是我们后面设定的数组的大小n+1,
// 而为了方便数组下标是从1开始的,如果n=1,是会有数组越界异常,因为num[2]中只有数组num[0]和num[1],这样num[2]=2就会有问题)
if (n < 2) {
return n;
}
//创建数组num,存储台阶数i所对应的方法数num[i]
int[] num = new int[n+1];
//台阶数为1有一种方法; 台阶数为2有2种方法
num[1] = 1;
num[2] = 2;
//n个台阶 :num[n-2] + num[n-1] 种方法
for (int i = 3; i <= n; i++) {
num[i] = num[i-2] + num[i-1];
}
//返回n个台阶所对应的方法数
return num[n];
}
}
方法2:
public static int climbStairs(int n) {
if (n < 3) {
return n;
}
int a = 1;
int b = 2;
int sum = 0;
for (int i = 3; i <= n; i++) {
sum = a + b;
a = b;
b = sum;
}
return sum;
}
(二)斐波那契额数列
题目描述
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
代码实现如下
方法1:
public static int fib(int n) {
//作用:大数的排列组合等,一般都要求将输出结果对1000000007取模(取余),防止int溢出。上面提示n的范围是0<= n <= 100
final int a = 1000000007;
if (n < 1) {
return n;
}
int[] num = new int[n + 1];
num[0] = 0;
num[1] = 1;
for (int i = 2; i <= n; i++) {
num[i] = (num[i - 1] + num[i - 2]) % a;
}
return num[n];
}
方法2:
public static int fib(int n) {
final int x = 1000000007;
if (n < 2) {
return n;
}
int a = 0;
int b = 1;
int sum = 0;
for (int i = 2; i <= n; i++) {
sum = (a + b) % x;
a = b;
b = sum;
}
return sum;
}