每日一题:剑指Offer 29.顺时针打印矩阵
1、题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
2、解法:矩阵分圈处理
矩阵分圈处理把矩阵分解成一圈一圈来处理,由外向内或由内向外。每次操作只考虑单独一圈的内容。
对于本题来说,给定左上角和右下角坐标,然后打印这圈结果,然后进行下一圈的处理。
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
rowNum = len(matrix)
if rowNum==0:
return []
rowCol = len(matrix[0])
startPointX, startPointY = 0, 0
endPointX, endPointY = rowNum-1, rowCol-1 # 注意最大坐标值需要减1
result = []
while startPointX<=endPointX and startPointY<=endPointY:
self.printOneLoop(matrix, result, startPointX, startPointY, endPointX, endPointY)
startPointX += 1
startPointY += 1
endPointX -= 1
endPointY -= 1
return result
def printOneLoop(self, matrix, result, startPointX, startPointY, endPointX, endPointY):
# 记得考虑只有一行的情况,否则下面的循环会遗漏最后一个元素(最简单的仅考虑矩阵只有一个元素)
if startPointX == endPointX:
for i in range(startPointY, endPointY+1):
# print(matrix[startPointX][i])
result.append(matrix[startPointX][i])
return
# 记得考虑只有一列的情况,否则下面的循环会遗漏最后一个元素(最简单的仅考虑矩阵只有一个元素)
if startPointY == endPointY:
for i in range(startPointX, endPointX+1):
# print(matrix[i][startPointY])
result.append(matrix[i][startPointY])
return
tmpX, tmpY = startPointX, startPointY
while tmpY < endPointY: # 注意每次循环不打印最后一个元素,留给下一个循环打印,每次循环包含起点不包含终点
# print(matrix[startPointX][tmpY])
result.append(matrix[startPointX][tmpY])
tmpY += 1
while tmpX < endPointX:
# print(matrix[tmpX][endPointY])
result.append(matrix[tmpX][endPointY])
tmpX += 1
tmpX, tmpY = endPointX, endPointY
while tmpY > startPointY:
# print(matrix[endPointX][tmpY])
result.append(matrix[endPointX][tmpY])
tmpY -= 1
while tmpX > startPointX:
# print(matrix[tmpX][startPointY])
result.append(matrix[tmpX][startPointY])
tmpX -= 1
执行用时:44 ms, 在所有 Python3 提交中击败了80.98%的用户
内存消耗:15.2 MB, 在所有 Python3 提交中击败了63.92%的用户