Skip to content

Commit ddb8113

Browse files
新增题70爬楼梯2解,更新NOTE内容
1 parent 2466d59 commit ddb8113

2 files changed

Lines changed: 109 additions & 1 deletion

File tree

Week_04/id_18/LeetCode_70_18.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff 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
}

Week_04/id_18/NOTE.md

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff 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+
练习和熟悉了动态规划及递归,还学了点数学。

0 commit comments

Comments
 (0)