File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -23,4 +23,39 @@ private int climbStairs(int n, int[] nums) {
2323
2424 return num ;
2525 }
26+
27+ public int climbStairs1 (int n ) {
28+ if (n <= 2 ) {
29+ return n ;
30+ }
31+
32+ int [] dp = new int [n + 1 ];
33+ dp [1 ] = 1 ;
34+ dp [2 ] = 2 ;
35+ for (int i = 3 ; i <= n ; i ++) {
36+ dp [i ] = dp [i - 1 ] + dp [i - 2 ];
37+ }
38+ return dp [n ];
39+ }
40+
41+ public int climbStairs2 (int n ) {
42+ if (n <= 2 ) {
43+ return n ;
44+ }
45+
46+ int first = 1 , second = 2 ;
47+ for (int i = 3 ; i <= n ; i ++) {
48+ int third = first + second ;
49+ first = second ;
50+ second = third ;
51+ }
52+
53+ return second ;
54+ }
55+
56+ public int climbStairs3 (int n ) {
57+ double sqrt5 = Math .sqrt (5 );
58+ double fibn = Math .pow ((1 + sqrt5 ) / 2 , n + 1 ) - Math .pow ((1 - sqrt5 ) / 2 , n + 1 );
59+ return (int ) (fibn / sqrt5 );
60+ }
2661}
Original file line number Diff line number Diff line change @@ -506,4 +506,77 @@ class Solution {
506506 }
507507}
508508```
509- ### 收获
509+ ### 解法二
510+ #### 思路
511+ 看了国内站官方解法三对于动态规划解法的讲解,发现其思路和我解法一二的思路有部分是基本一致的:** dp[ i] = dp[ i - 1] + dp[ i - 2] ** 。
512+
513+ 从覃老师周三一开始对动态规划的讲解中了解到,这题是属于一维的动态规划的,使用一维数组dp[ ]
514+ - 数组下标对应的是台阶数
515+ - 下标对应的元素代表的是走当前台阶数有的解法
516+
517+ 因为题目定义每次只能是1或者2步,所以到达当前台阶i的必由路径一定是
518+ - i - 1级台阶直接走1级
519+ - i - 2级台阶直接走2级
520+
521+ 于是到达i级台阶的方法数dp[ i] 就是dp[ i - 1] + dp[ i - 2] ,也就是从第3级开始,每一级的结果就是前一两级结果之和。
522+ - 时间复杂度:O(N)
523+ - 空间复杂度:O(N)
524+ #### 代码
525+ ``` java
526+ class Solution {
527+ public int climbStairs (int n ) {
528+ if (n <= 2 ) {
529+ return n;
530+ }
531+
532+ int [] dp = new int [n + 1 ];
533+ dp[1 ] = 1 ;
534+ dp[2 ] = 2 ;
535+ for (int i = 3 ; i <= n; i++ ) {
536+ dp[i] = dp[i - 1 ] + dp[i - 2 ];
537+ }
538+ return dp[n];
539+ }
540+ }
541+ ```
542+ #### 优化代码
543+ 在写如上代码时发现,其实整个过程主要出现的就是三个变量
544+ - 当前的数
545+ - 前一位的数
546+ - 前二位的数
547+
548+ 所以不需要使用一个n+1位的数组来保存当前值,只需要3个变量就可以了。于是对解法二的代码进行了优化
549+ ``` java
550+ class Solution {
551+ public int climbStairs (int n ) {
552+ if (n <= 2 ) {
553+ return n;
554+ }
555+
556+ int first = 1 , second = 2 ;
557+ for (int i = 3 ; i <= n; i++ ) {
558+ int third = first + second;
559+ first = second;
560+ second = third;
561+ }
562+
563+ return second;
564+ }
565+ }
566+ ```
567+ 但执行结果显示,空间没有减少,没办法解释,希望有人解惑。
568+ ### 解法三
569+ #### 思路
570+ 使用数学公式解,真的快。
571+ #### 代码
572+ ``` java
573+ class Solution {
574+ public int climbStairs (int n ) {
575+ double sqrt5= Math . sqrt(5 );
576+ double fibn= Math . pow((1 + sqrt5)/ 2 ,n+ 1 )- Math . pow((1 - sqrt5)/ 2 ,n+ 1 );
577+ return (int )(fibn/ sqrt5);
578+ }
579+ }
580+ ```
581+ ### 收获
582+ 练习和熟悉了动态规划及递归,还学了点数学。
You can’t perform that action at this time.
0 commit comments