背景
我正在解决标准LeetCode Question 48。我知道有很多解决方案,但是我正在尝试以一种对我来说有意义的方法来解决问题。我基本上是想将矩阵旋转90度。我正在尝试交换方矩阵每一层的每个值。
这是我的代码
def rotate_image(matrix):
top = 0
bottom = len(matrix)
left = 0
right = len(matrix[0])
total_layers = round(bottom / 2)
for i in range(0, total_layers):
for j in range(left, right - 1):
top_left = matrix[top][j]
top_right = matrix[j][right - 1]
bottom_right = matrix[bottom - 1][right - (j + 1)]
bottom_left = matrix[bottom - (1+j)][left]
matrix[top][j] = bottom_left
matrix[j][right - 1] = top_left
matrix[bottom - 1][right - (j + 1)] = top_right
matrix[bottom - (1 + j)][left] = bottom_right
top += 1
left += 1
right -= 1
bottom -= 1
print(matrix)
由于某种原因,我的代码通过了大多数情况,但是当我尝试以下情况时
print(rotate_image([[5, 1, 9, 11], [2, 4, 8, 10], [13, 3, 6, 7], [15, 14, 12, 16]]))
失败。我花了2个小时尝试对其进行调试,我可能正在寻找一些东西,但不确定它到底是什么。
我希望获得一些反馈。
下一种方法选择矩阵的左上四分之一,从该四分之一存储一个元素,并以循环方式重新排列其他四分之一的相应元素
def rotate_image(matrix):
n = len(matrix)
for i in range(0, (n + 1) // 2):
for j in range(0, n // 2):
storage = matrix[i][j]
matrix[i][j] = matrix[n - j - 1][i]
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1]
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1]
matrix[j][n - i - 1] = storage
for i in range(len(matrix)):
print(matrix[i])
mt = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
rotate_image(mt)
print()
mt = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21,22, 23,24,25]]
rotate_image(mt)
[13, 9, 5, 1]
[14, 10, 6, 2]
[15, 11, 7, 3]
[16, 12, 8, 4]
[21, 16, 11, 6, 1]
[22, 17, 12, 7, 2]
[23, 18, 13, 8, 3]
[24, 19, 14, 9, 4]
[25, 20, 15, 10, 5]
您遇到索引问题。让我们检查一下代码的一部分:
for j in range(left, right - 1):
top_left = matrix[top][j]
top_right = matrix[j][right - 1]
bottom_right = matrix[bottom - 1][right - (j + 1)]
考虑j
取值为right-2
时会发生什么。您将从right - (j+1) = right - (right-2+1)=1
列中提取一个条目。那就是无论您位于哪一层,都将从第1
列中提取。您需要调整回图层的起点,而不是第right - (j+1)
列,而需要访问第left + right - (j+1)
列。此外,请注意left + right
实际上是一个常数,它将等于矩阵的长度。
[此外,我们已经被告知它是一个方矩阵,因此top
和left
始终相同,并且bottom
和right
始终相等。
这里是有效的代码:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
top = 0
bottom = len(matrix)
matrix_len = bottom
total_layers = round(bottom / 2)
for i in range(0, total_layers):
for j in range(top, bottom - 1):
top_left = matrix[top][j]
top_right = matrix[j][bottom - 1]
bottom_right = matrix[bottom - 1][matrix_len - (j + 1)]
bottom_left = matrix[matrix_len - (1+j)][top]
matrix[top][j] = bottom_left
matrix[j][bottom-1] = top_left
matrix[bottom - 1][matrix_len - (j + 1)] = top_right
matrix[matrix_len - (1 + j)][top] = bottom_right
top += 1
bottom -= 1