(LeetCode 70)爬楼梯
递归(自顶向下一层层分解,直到终止条件)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
- 问题已理解
方法一(直接递归)
class Solution {
private Map<Integer,Integer> storeMap = new HashMap<>();
public int climbStairs(int n) {
if(n == 1) return 1;
if(n == 2) return 2;
return climbStairs(n-1)+climbStairs(n-2);
}
}
方法一改进
方法一中f(n-1)和f(n-2)会在计算过程中重复计算,浪费时间,若用HashMap存储中间计算结果就会好很多
class Solution {
private Map<Integer,Integer> storeMap = new HashMap<>();
public int climbStairs(int n) {
if(n == 1) return 1;
if(n == 2) return 2;
if(null != storeMap.get(n))
return storeMap.get(n);
else{
int result = climbStairs(n-1)+climbStairs(n-2);
storeMap.put(n,result);
return result;
}
}
}
方法二循环
由于f(n) = f(n-1) + f(n-2) (n>3) 即每一个f(n)都需要前面两个值,所以直接自底向上逐步累加
public int climbStairs(int n) {
if(n == 1) return 1;
if(n == 2) return 2;
int result = 0;
int pre = 2;
int prePre = 1;
for(int i = 3;i <= n;++i){
result = pre + prePre;
prePre = pre;
pre = result;
}
return result;
}
(剑指Offer 10)斐波那契数列
写一个函数,输入 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。
- 问题未理解
这个和上面爬楼梯一样的解法,但是取模这一步我不太理解,是为了计算过程中不会出现超出int范围的数吗,那取模后结果不就也有变化吗,不是原本实际的数了吗。即本题是题目要求取模,实际中并不会取模吧
class Solution {
public int fib(int n) {
if (n == 0 || n == 1)
return n;
int a = 1, b = 0;
for (int i = 1; i < n; i++) {
a = a + b;
b = a - b;
a %= 1000000007;
}
return a;
}
}