diff --git a/0048.Rotate-Image/memo.md b/0048.Rotate-Image/memo.md new file mode 100644 index 0000000..080a678 --- /dev/null +++ b/0048.Rotate-Image/memo.md @@ -0,0 +1,30 @@ +# 48. Rotate Image + +## step1 +転置と反転でかける。4mぐらい。 + +転置と反転が二面体群d4の生成元であることから従う。 + +エラー処理を少しだけ変える。 + +## 他の人のコード + +https://github.com/potrue/leetcode/pull/80 + +setを使った解法。メモリをO(n^2)使っているので二次元配列をもう一つ使う解法と変わらないのでは。 + +> matrix[y][x] となると思います + +この順番はたまに目にする + +https://leetcode.com/problems/rotate-image/solutions/8136968/rotate-image-sol-in-py-by-aryankumardube-8gti/ + +外部メモリを使って良いなら一行で書ける + +```python +matrix[::]=[list(reversed(col)) for col in zip(*matrix)] +``` + +https://leetcode.com/problems/rotate-image/solutions/8134901/cyclic-orbit-permutation-by-mpractice-sfyq/ + +matrixを一度しか触らない方法もある。インデックスがややこしい。 diff --git a/0048.Rotate-Image/step1.py b/0048.Rotate-Image/step1.py new file mode 100644 index 0000000..b5e37a6 --- /dev/null +++ b/0048.Rotate-Image/step1.py @@ -0,0 +1,12 @@ +class Solution: + def rotate(self, matrix: list[list[int]]) -> None: + if not matrix or not matrix[0] or len(matrix) != len(matrix[0]): + raise ValueError("matrix is invalid") + + for i in range(len(matrix)): + for j in range(i+1, len(matrix)): + matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] + + for i in range(len(matrix)): + matrix[i].reverse() + diff --git a/0048.Rotate-Image/step1_revised.py b/0048.Rotate-Image/step1_revised.py new file mode 100644 index 0000000..8beef90 --- /dev/null +++ b/0048.Rotate-Image/step1_revised.py @@ -0,0 +1,14 @@ +class Solution: + def rotate(self, matrix: list[list[int]]) -> None: + if not matrix or not matrix[0]: + return + if len(matrix) != len(matrix[0]): + raise ValueError("matrix is invalid") + + for i in range(len(matrix)): + for j in range(i+1, len(matrix)): + matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] + + for i in range(len(matrix)): + matrix[i].reverse() + diff --git a/0048.Rotate-Image/step2.py b/0048.Rotate-Image/step2.py new file mode 100644 index 0000000..a0f36cb --- /dev/null +++ b/0048.Rotate-Image/step2.py @@ -0,0 +1,13 @@ +class Solution: + def rotate(self, matrix: list[list[int]]) -> None: + for layer in range(len(matrix) // 2): + first = layer + last = len(matrix) - 1 - layer + for i in range(first, last): + offset = i - first + + temp = matrix[first][i] + matrix[first][i] = matrix[last - offset][first] + matrix[last - offset][first] = matrix[last][last - offset] + matrix[last][last - offset] = matrix[i][last] + matrix[i][last] = temp