每日一题:剑指Offer 29.顺时针打印矩阵

每日一题:剑指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%的用户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值