给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
思路:将第一行extend进结果数组里,然后删除第一行,再使该矩阵逆时针旋转90度,再将第一行extend… 如此往复,直到矩阵元素为零
class Solution:
def spiralOrder(self, matrix):
# List转numpy.array
matrix = np.array(matrix)
res = []
while 1:
# 没有元素的时候结束循环
if matrix.size == 0:
return res
res.extend(matrix[0].tolist())
# 删除第一行
matrix = np.delete(matrix, 0, axis=0)
# 矩阵逆时针旋转90度
matrix = np.transpose(matrix)
matrix = matrix[::-1, :]
其中:利用zip 实现矩阵转置
"""
[[1,2,3],
[4,5,6],
[7,8,9]]
"""
d=list(zip(*[[1,2,3],[4,5,6],[7,8,9]]))
print(d)
"""
[(1, 4, 7),
(2, 5, 8),
(3, 6, 9)]
"""
所以:逆时针旋转90度
d=list(zip(*[[1,2,3],[4,5,6],[7,8,9]]))[::-1]
print(d)
"""
[(3, 6, 9),
(2, 5, 8),
(1, 4, 7)]
"""
到这里已经足够解决问题了,但是我们想让序列中每一个元素也变为序列而非元组
d=list(map(list,list(zip(*[[1,2,3],[4,5,6],[7,8,9]]))[::-1]))
print(d)
"""
[[3, 6, 9],
[2, 5, 8],
[1, 4, 7]]
"""
得到最终算法
class Solution:
def spiralOrder(self, matrix):
res=[]
while matrix:
#存第一行
temp = matrix.pop(0)
res.extend(temp)
#将矩阵逆时针旋转90度
matrix = list(map(list,list(zip(*matrix))[::-1]))
return res
在解决54题的时候发现了48题,所以顺便解决
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-image
矩阵旋转参考了该篇博客
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
示例 3:
输入:matrix = [[1]]
输出:[[1]]
示例 4:
输入:matrix = [[1,2],[3,4]]
输出:[[3,1],[4,2]]
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
matrix[:] = list(map(list,list(zip(*matrix[::-1]))))
# 注意下面的代码力扣会认为非原地修改所以不会通过
#matrix = list(map(list,list(zip(*matrix[::-1]))))
class Solution:
def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
# 计算原矩阵的行数和列数
row_nums = len(mat)
column_nums = len(mat[0])
# 如果 r,c 不合规,直接输出原矩阵
if r * c != row_nums * column_nums:
return mat
# 准备指定行列的空矩阵
res = [[0]*c for column in range(r)] # 每一行有c列个元素,一共有r行
# i:index//列数,j:index%列数
for index in range(r*c):
res[index//c][index%c] = mat[index//column_nums][index%column_nums]
return res