何为斐波那契数列,简单来说,就是F(n)=F(n-1)+F(n-2),斐波那契数列可应用于多个场景,比如说跳台阶问题
斐波那契数列简单题:
递归上去,啪就是一个超时,还是得用迭代
class Solution {
public int fib(int n) {
if(n==0){
return 0;
}
if(n==1){
return 1;
}
if(n==2){
return 1;
}
return (fib(n-1)+fib(n-2))>1000000007?1:fib(n-1)+fib(n-2);
}
}
不超时的朴素做法
class Solution {
public int fib(int n) {
final int MOD = 1000000007;
if (n < 2) {
return n;
}
int p = 0, q = 0, r = 1;
for (int i = 2; i <= n; ++i) {
p = q;
q = r;
r = (p + q) % MOD;
}
return r;
}
}
跳台阶问题,类似于斐波那契数列,台阶可以一次跳一层或者两层,问跳n层台阶有几种方法。
倒着推,跳上最后一级台阶需要跳一步或两步,即F(n)=F(n-1)+F(n-2),具体解法见代码,基本与求解斐波那契数列F(n)的方法一致
class Solution {
public int numWays(int n) {
final int MOD = 1000000007;
if(n==0){
return 1;
}
if (n==1) {
return 1;
}
int p = 0, q = 1, r = 1;
for (int i = 2; i <= n; i++) {
p = q;
q = r;
r = (p + q) % MOD;
}
return r;
}
}
跳台阶进阶问题,即在特定的条件下才能够跳两步,即不符合条件时F(n)=F(n-1),
符合条件时F(n)=F(n-1)+F(n-2),详见具体题目
这时候需要判定条件,看能不能跳两步
class Solution {
public int translateNum(int num) {
// 预处理
char[] chs = String.valueOf(num).toCharArray();
int len = chs.length;
// 到i结尾的字符串的翻译方法数量
int [] dp = new int [len];
// 首项是1
dp[0] = 1;
for (int i = 1; i < len; ++i) {
// 第一种翻译方法
dp[i] = dp[i - 1];
// 第二种翻译方法 检查临近的两位是否['10', '25']之间
if (chs[i - 1] == '1' || chs[i - 1] == '2' && chs[i] <= '5')
dp[i] += ((i - 2 < 0) ? 1 : dp[i - 2]); // 若不能继承 就设为1 否则继承dp[i-2]
}
return dp[len - 1];
}
}