diff --git a/276_paint_fence/.DS_Store b/276_paint_fence/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/276_paint_fence/.DS_Store differ diff --git a/276_paint_fence/problem.md b/276_paint_fence/problem.md new file mode 100644 index 0000000..f59602e --- /dev/null +++ b/276_paint_fence/problem.md @@ -0,0 +1 @@ +## 問題: [276. Paint Fence](https://www.lintcode.com/problem/514/) diff --git a/276_paint_fence/step1.md b/276_paint_fence/step1.md new file mode 100644 index 0000000..5f729ea --- /dev/null +++ b/276_paint_fence/step1.md @@ -0,0 +1,33 @@ +# Step 1 + +- 3連続同じ色にはできない +- $post_{k}$に塗れる色は、$post_{k - 1}$、$post_{k - 2}$による +- 解けなかったので[解説](https://www.geeksforgeeks.org/dsa/painting-fence-algorithm/)を見た + - 塗り方の選択肢は2つ + 1. $post_{n}$を$post_{n-1}$と違う色にする + - 色の選択肢は$k-1$ + 2. $post_{n}$と$post_{n-1}$を同じにする + - 色の選択肢は$k-1$ + - $numWays(n) = numWays(n - 2) * (k - 1) + numWays(n-1)*(k-1)$ + +```python +class Solution: + """ + @param n: non-negative integer, n posts + @param k: non-negative integer, k colors + @return: an integer, the total number of ways + """ + def num_ways(self, n: int, k: int) -> int: + # write your code here + if n == 0: + return 0 + if n == 1: + return k + if n == 2: + return k * k + return num_ways(n - 1) * (k - 1) + num_ways(n - 2) * (k - 1) +``` + +時間計算量: $O(2^n)$ + +空間計算量:$O(n)$ diff --git a/276_paint_fence/step2.md b/276_paint_fence/step2.md new file mode 100644 index 0000000..ffa89ff --- /dev/null +++ b/276_paint_fence/step2.md @@ -0,0 +1,33 @@ +# Step 2 + +- 再帰をなくして計算量を改善する + +```python +class Solution: + """ + @param n: non-negative integer, n posts + @param k: non-negative integer, k colors + @return: an integer, the total number of ways + """ + def num_ways(self, n: int, k: int) -> int: + # write your code here + if n == 0: + return 0 + if n == 1: + return k + if n == 2: + return k * k + num_ways_prev_2 = k + num_ways_prev_1 = k * k + + for i in range(2, n): + tmp = num_ways_prev_1 + num_ways_prev_1 = (k - 1) * (num_ways_prev_1 + num_ways_prev_2) + num_ways_prev_2 = tmp + return num_ways_prev_1 + +``` + +時間計算量: $O(n)$ + +空間計算量: $O(1)$ diff --git a/276_paint_fence/step3.md b/276_paint_fence/step3.md new file mode 100644 index 0000000..8584db8 --- /dev/null +++ b/276_paint_fence/step3.md @@ -0,0 +1,32 @@ +# Step 3 + +```python +class Solution: + """ + @param n: non-negative integer, n posts + @param k: non-negative integer, k colors + @return: an integer, the total number of ways + """ + def num_ways(self, n: int, k: int) -> int: + # write your code here + if n == 0: + return 0 + if n == 1: + return k + if n == 2: + return k * k + num_ways_prev_2 = k + num_ways_prev_1 = k * k + + for i in range(2, n): + tmp = num_ways_prev_1 + num_ways_prev_1 = (k - 1) * (num_ways_prev_1 + num_ways_prev_2) + num_ways_prev_2 = tmp + return num_ways_prev_1 +``` + +1回目: 1分 17秒 + +2回目: 1分 20秒 + +3回目: 1分 16秒