假设你正在爬楼梯。须要 n 阶你才能到达楼顶。优化
每次你能够爬 1 或 2 个台阶。你有多少种不一样的方法能够爬到楼顶呢?spa
注意:给定 n 是一个正整数。code
示例 1:blog
输入: 2
输出: 2
解释: 有两种方法能够爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶io
示例 2:class
输入: 3
输出: 3
解释: 有三种方法能够爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶变量
设 $f[n]$ 表示跳上 $n$ 级台阶的方案数目,所以很容易获得 $f[n] = f[n-1] + f[n-2]$,这就是一个斐波那契数列。cli
咱们能够用递推的方法 $O(n)$ 求出斐波那契数列求出第 $n$ 项,而后因为每次递推只涉及到三个变量,因此咱们用滚动优化的方式使得空间复杂度变成 $O(1)$。方法
AC代码:im
class Solution { public: int climbStairs(int n) { if(n<=3) return n; int a[3]={1,1,2}; for(int i=3;i<=n;i++) a[i%3]=a[(i+1)%3]+a[(i+2)%3]; return a[n%3]; } };
固然,咱们知道斐波那契数列是由通项公式的,咱们能够用通项公式 $O(1)$ 地求第 $n$ 项,固然须要注意一下double类型转成int类型时候的一些精度上的小问题。
AC代码:
inline int fibo(int n) { double res=1.0/sqrt(5); res*=pow((1.0+sqrt(5))/2.0,n)-pow((1.0-sqrt(5))/2.0,n); return (int)(res+1e-10); } class Solution { public: int climbStairs(int n) { return fibo(n+1); } };