难度中等1060
给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:
输入: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]]
解题思路:将矩阵按对角线折叠交换,再按水平方向折叠交换。
代码:
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
if n>1:
temp = [[0]*n for i in range(n)]
for i in range(n):
for j in range(n):
temp[j][i] = matrix[i][j]
mid = n//2
for i in range(n):
for j in range(n):
matrix[i][j], temp[i][n-1-j] = temp[i][n-1-j], matrix[i][j]
难度中等912
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入: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]
解题思路:寻找螺旋数组的规律,先写出输出最外一圈的代码,再写出遍历整个数组的代码。考虑二维矩阵为行或列为1的情况。
代码:
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
li = []
m_start = n_start = 0
m_end = m = len(matrix)
n_end = n = len(matrix[0])
if m==1: # 行为1的情况
return matrix[0]
if n==1: # 列为1的情况
for i in range(m):
li.append(matrix[i][0])
return li
times = min(m, n) - 1
for it in range(times):
li += self.circle(matrix,m_start,m_end,n_start,n_end) # 遍历一圈数字
m_start+=1;n_start+=1
m_end-=1;n_end-=1
return li
def circle(Object,matrix,m_start,m_end,n_start,n_end): # 左闭右开,m_end,n_end是取不到的
res = list()
i, j = m_start, n_start
if m_start == m_end-1:
for j in range(n_start, n_end):
res.append(matrix[i][j])
return res
if n_start == n_end-1:
for i in range(m_start, m_end):
res.append(matrix[i][j])
return res
for j in range(n_start, n_end):
res.append(matrix[i][j])
for i in range(m_start+1, m_end):
res.append(matrix[i][j])
for j in range(n_end-2, n_start-1,-1):
res.append(matrix[i][j])
for i in range(m_end-2, m_start, -1):
res.append(matrix[i][j])
return res