Skip to content

Commit 93437e6

Browse files
committed
feat: 0070.Climbing Stairs
1 parent 258d6c0 commit 93437e6

File tree

3 files changed

+87
-7
lines changed

3 files changed

+87
-7
lines changed

Leetcode/0070.Climbing-Stairs/README.md

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ Constraints:
9393
* Acceptance Rate: 52.3%
9494

9595
## 題目大意
96-
96+
類似 [Fibonacci Number](../0509.Fibonacci-Number/README.md)
9797

9898
## 解題思路
9999

@@ -114,10 +114,57 @@ https://github.com/kimi0230/LeetcodeGolang/blob/master/Leetcode/0070.Climbing-St
114114

115115
```go
116116

117+
package climbingstairs
118+
119+
// 時間複雜 O(n), 空間複雜 O(n)
120+
func ClimbStairs(n int) int {
121+
dp := make([]int, n+1)
122+
dp[0], dp[1] = 1, 1
123+
124+
for i := 2; i <= n; i++ {
125+
dp[i] = dp[i-1] + dp[i-2]
126+
}
127+
return dp[n]
128+
}
129+
130+
func ClimbStairsCache(n int) int {
131+
dp := make([]int, n+1)
132+
dp[0], dp[1] = 1, 1
133+
134+
for i := 2; i <= n; i++ {
135+
if val := dp[i]; val == 0 {
136+
dp[i] = dp[i-1] + dp[i-2]
137+
}
138+
}
139+
return dp[n]
140+
}
141+
142+
func ClimbStairsRecursive(n int) int {
143+
dp := make([]int, n+1)
144+
// dp[0], dp[1] = 1, 1
145+
146+
var climbClosure func(n int) int
147+
climbClosure = func(n int) int {
148+
if n <= 2 {
149+
return n
150+
}
151+
dp[n] = climbClosure(n-1) + climbClosure(n-2)
152+
return dp[n]
153+
}
154+
return climbClosure(n)
155+
}
117156
```
118157

119158
## Benchmark
120159

121160
```sh
122-
161+
goos: darwin
162+
goarch: amd64
163+
pkg: LeetcodeGolang/Leetcode/0070.Climbing-Stairs
164+
cpu: Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz
165+
BenchmarkClimbStairs-8 10386211 112.1 ns/op 320 B/op 1 allocs/op
166+
BenchmarkClimbStairsCache-8 10184984 118.8 ns/op 320 B/op 1 allocs/op
167+
BenchmarkClimbStairsRecursive-8 4 281980486 ns/op 320 B/op 1 allocs/op
168+
PASS
169+
ok LeetcodeGolang/Leetcode/0070.Climbing-Stairs 5.591s
123170
```

Leetcode/0070.Climbing-Stairs/main.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,18 @@ func ClimbStairs(n int) int {
1111
return dp[n]
1212
}
1313

14+
func ClimbStairsCache(n int) int {
15+
dp := make([]int, n+1)
16+
dp[0], dp[1] = 1, 1
17+
18+
for i := 2; i <= n; i++ {
19+
if val := dp[i]; val == 0 {
20+
dp[i] = dp[i-1] + dp[i-2]
21+
}
22+
}
23+
return dp[n]
24+
}
25+
1426
func ClimbStairsRecursive(n int) int {
1527
dp := make([]int, n+1)
1628
// dp[0], dp[1] = 1, 1

Leetcode/0070.Climbing-Stairs/main_test.go

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ var tests = []struct {
1414
3,
1515
3,
1616
},
17+
{
18+
39,
19+
63245986,
20+
},
1721
}
1822

1923
func TestClimbStairs(t *testing.T) {
@@ -25,6 +29,15 @@ func TestClimbStairs(t *testing.T) {
2529
}
2630
}
2731

32+
func TestClimbStairsCache(t *testing.T) {
33+
for _, tt := range tests {
34+
// if got := ReverseList(tt.arg1); !reflect.DeepEqual(got, tt.want) {
35+
if got := ClimbStairsCache(tt.arg1); got != tt.want {
36+
t.Errorf("got = %v, want = %v", got, tt.want)
37+
}
38+
}
39+
}
40+
2841
func TestClimbStairsRecursive(t *testing.T) {
2942
for _, tt := range tests {
3043
// if got := ReverseList(tt.arg1); !reflect.DeepEqual(got, tt.want) {
@@ -37,14 +50,21 @@ func TestClimbStairsRecursive(t *testing.T) {
3750
func BenchmarkClimbStairs(b *testing.B) {
3851
b.ResetTimer()
3952
for i := 0; i < b.N; i++ {
40-
ClimbStairs(tests[0].arg1)
53+
ClimbStairs(tests[2].arg1)
54+
}
55+
}
56+
57+
func BenchmarkClimbStairsCache(b *testing.B) {
58+
b.ResetTimer()
59+
for i := 0; i < b.N; i++ {
60+
ClimbStairsCache(tests[2].arg1)
4161
}
4262
}
4363

4464
func BenchmarkClimbStairsRecursive(b *testing.B) {
4565
b.ResetTimer()
4666
for i := 0; i < b.N; i++ {
47-
ClimbStairsRecursive(tests[0].arg1)
67+
ClimbStairsRecursive(tests[2].arg1)
4868
}
4969
}
5070

@@ -54,8 +74,9 @@ goos: darwin
5474
goarch: amd64
5575
pkg: LeetcodeGolang/Leetcode/0070.Climbing-Stairs
5676
cpu: Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz
57-
BenchmarkClimbStairs-8 40758399 30.75 ns/op 24 B/op 1 allocs/op
58-
BenchmarkClimbStairsRecursive-8 42196260 27.60 ns/op 24 B/op 1 allocs/op
77+
BenchmarkClimbStairs-8 10386211 112.1 ns/op 320 B/op 1 allocs/op
78+
BenchmarkClimbStairsCache-8 10184984 118.8 ns/op 320 B/op 1 allocs/op
79+
BenchmarkClimbStairsRecursive-8 4 281980486 ns/op 320 B/op 1 allocs/op
5980
PASS
60-
ok LeetcodeGolang/Leetcode/0070.Climbing-Stairs 2.489s
81+
ok LeetcodeGolang/Leetcode/0070.Climbing-Stairs 5.591s
6182
*/

0 commit comments

Comments
 (0)