前言
一、详解
解法一 通项公式
这种题目是典型的斐波那契问题,可以看百度百科的斐波那契数列,百度百科上也给出了斐波那契数列的通项公式:
由此可以引出第一种解法。这里参考力扣的题解,画解算法:70. 爬楼梯,也感谢作者的无私奉献。
public int climbStairs(int n) {
double sqrt_5 = Math.sqrt(5);
double fib_n = Math.pow((1 + sqrt_5) / 2, n + 1) - Math.pow((1 - sqrt_5) / 2,n + 1);
return (int)(fib_n / sqrt_5);
}
解法二 动态规划
这里直接写解法,详细的可以看上面的题解,不得不说,上面的是真大神。
public int climbStairs(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
这个解法的问题在于空间复杂度较高,下面给出力扣国际站上的最高票解法。
解法三 优化空间复杂度
public int climbStairs(int n) {
// base cases
if(n <= 0) return 0;
if(n == 1) return 1;
if(n == 2) return 2;
int one_step_before = 2;
int two_steps_before = 1;
int all_ways = 0;
for(int i=2; i<n; i++){
all_ways = one_step_before + two_steps_before;
two_steps_before = one_step_before;
one_step_before = all_ways;
}
return all_ways;
}
可以看到只用了三个变量来回赋值,解决了空间复杂度的问题
总结
近些年,国内的程序员越来越注重算法的联系,我觉得一方面这虽然是因为想进入大厂,必须准备算法,另一方面,也是一个国家软件行业成熟的表现,不只是考虑软件的实现,更多是对软件思维的考量和软件性能的优化,所以算法已经是程序员的必修课了,如果程序员不注重算法,那么感觉还是有些危险的,加油!