Я знаю, что есть простой способ использовать транспонирование для поворота квадратной матрицы на 90 градусов, но я пишу решение, как будто я не знаю этого (другими словами, я хочу сделать обмен).Общая идея ниже - поменять слой за слоем.offset
представляет, какой слой (наружу внутрь) заменяется.
Вот алгоритм (обратите внимание, что он заключен в class
, потому что это Leetcode вещь):
class Solution:
def rotate(self, matrix):
for start in range(len(matrix)//2):
end = len(matrix) - start - 1
# swap all 4 coordinates:
for offset in range(start, end):
# swap top_left over top_right
temp, matrix[start+offset][end] = matrix[start+offset][end], matrix[start][start+offset]
# swap top_right -> bottom_right
temp, matrix[end][end-offset] = matrix[end][end-offset], temp
# swap bottom_right -> bottom_left
temp, matrix[end-offset][start] = matrix[end-offset][start], temp
# swap bottom_left -> top_left
matrix[start][start+offset] = temp
Это работает для некоторых руктесты с небольшими матрицами, а также входные тесты меньшего размера в представлении Leetcode.Однако он не работает на следующем входе:
[[ 2, 29, 20, 26, 16, 28],
[12, 27, 9, 25, 13, 21],
[32, 33, 32, 2, 28, 14],
[13, 14, 32, 27, 22, 26],
[33, 1, 20, 7, 21, 7],
[ 4, 24, 1, 6, 32, 34]]
Ожидаемый вывод:
[[ 4, 33, 13, 32, 12, 2],
[24, 1, 14, 33, 27, 29],
[ 1, 20, 32, 32, 9, 20],
[ 6, 7, 27, 2, 25, 26],
[32, 21, 22, 28, 13, 16],
[34, 7, 26, 14, 21, 28]]
Мой вывод:
[[ 4, 33, 13, 32, 12, 2],
[24, 1, 7, 33, 27, 29],
[ 1, 20, 32, 2, 14, 20],
[ 6, 28, 32, 27, 25, 26],
[32, 21, 22, 9, 13, 16],
[34, 7, 26, 14, 21, 28]]
Эта матрица просто большаядостаточно там, где становится утомительно проходить алгоритм вручную, как я делал для небольших входных случаев для отладки.Где ошибка в моей реализации?