将矩阵旋转90度

问题描述 投票:1回答:3

背景

我正在解决标准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个小时尝试对其进行调试,我可能正在寻找一些东西,但不确定它到底是什么。

我希望获得一些反馈。

python algorithm multidimensional-array data-structures
3个回答
2
投票

我可以为您提供另一种干净的方法来将方阵旋转90度。

步骤1:在对角线上交换元素。步骤2:水平镜像元素

您得到了旋转矩阵。

此外,您还可以根据需要旋转矩阵的方向围绕水平和垂直镜像进行播放。

例如

enter image description here

您的矩阵旋转了90°


0
投票

下一种方法选择矩阵的左上四分之一,从该四分之一存储一个元素,并以循环方式重新排列其他四分之一的相应元素

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]

0
投票

您遇到索引问题。让我们检查一下代码的一部分:

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实际上是一个常数,它将等于矩阵的长度。

[此外,我们已经被告知它是一个方矩阵,因此topleft始终相同,并且bottomright始终相等。

这里是有效的代码:

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
© www.soinside.com 2019 - 2024. All rights reserved.