假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
class Solution {
第一次提交的答案....慢
// public int climbStairs(int n) {
// if(n==1||n==2){
// return n;
// }
// //此处重复太多了
// return climbStairs(n-1)+climbStairs(n-2);
// }
利用数组记录
// public int climbStairs(int n) {
// if(n==1||n==2){
// return n;
// }
// int[] total = new int[n];
// total[0] = 1;
// total[1] = 2;
// for(int i = 2;i<n;i++){
// //每一步都保存进数组
// total[i] = total[i-1]+total[i-2];
// }
// return total[n-1];
// }
//减少数组大小优化后
public int climbStairs(int n) {
int[] total = new int[]{1,2};
for(int i = 2;i<n;i++){
//替换旧数据
total[i%2] = total[0]+total[1];
}
return total[(n-1)%2];
}
//斐波那契数列通项公式直接求解
public int climbStairs(int n) {
if(n>3){
return (int) (Math.sqrt(5)/5* (Math.pow((1 + Math.sqrt(5)) / 2, n + 1) - Math.pow((1 - Math.sqrt(5)) / 2, n + 1))) ;
}
return n;
}
}