描述
大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
斐波那契数列是一个满足 fib(x)=\left\{ \begin{array}{rcl} 1 & {x=1,2}\\ fib(x-1)+fib(x-2) &{x>2}\\ \end{array} \right.fib(x)={1fib(x−1)+fib(x−2)x=1,2x>2 的数列
数据范围:1\leq n\leq 401≤n≤40
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n) ,本题也有时间复杂度 O(logn)O(logn) 的解法
public class Solution {
public int Fibonacci(int n) {
//递归思路
// if(n==1 ||n==2) return 1;
// else
// return Fibonacci(n-1)+Fibonacci(n-2);
//动态规划
if(n==1 ||n==2) return 1;
int p=1 ,c=1,r=-1;
for( int i=3;i<=n;i++){
r=p+c;
p=c;
c=r;
}
return r;
}
}
描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:1 \leq n \leq 401≤n≤40
要求:时间复杂度:O(n)O(n) ,空间复杂度: O(1)O(1)
题目分析,假设f[i]表示在第i个台阶上可能的方法数。逆向思维。如果我从第n个台阶进行下台阶,下一步有2中可能,一种走到第n-1个台阶,一种是走到第n-2个台阶。所以f[n] = f[n-1] + f[n-2].
public class Solution {
public int jumpFloor(int target) {
//逆向思维。如果我从第n个台阶进行下台阶,下一步有2中可能,
// 一种走到第n-1个台阶,一种是走到第n-2个台阶。所以f[n] = f[n-1] + f[n-2].
if(target==1) return 1;
if(target==2) return 2;
int p=1,c=2,r=-1;
for(int i=3;i<=target;i++){
r=p+c;
p=c;
c=r;
}
return r;
}
}