Leetcode刷题:剑指offer【面试题29 顺时针打印矩阵】

文章目录

  • 思路 1:遍历
  • 思路 2:旋转矩阵

【面试题29 顺时针打印矩阵】

难度: 简单

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

Leetcode题目对应位置: 面试题29:顺时针打印矩阵

思路 1:遍历

设置 4 个边界:top,bottom,left,right,用以限制当前遍历的最大范围。遍历顺序按照:从左到右,从上到下,从右到左,从下到上的顺序。

时间复杂度:O(mn),m 和 n 分别为矩阵的行数和列数
空间复杂度:O(1),存储新的遍历顺序

class Solution:
    def spiralOrder(self, matrix:[[int]]) -> [int]:
        if not matrix: return []
        l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
        while True:
            for i in range(l, r + 1): res.append(matrix[t][i]) # left to right
            t += 1
            if t > b: break
            for i in range(t, b + 1): res.append(matrix[i][r]) # top to bottom
            r -= 1
            if l > r: break
            for i in range(r, l - 1, -1): res.append(matrix[b][i]) # right to left
            b -= 1
            if t > b: break
            for i in range(b, t - 1, -1): res.append(matrix[i][l]) # bottom to top
            l += 1
            if l > r: break
        return res

代码来源:mian-shi-ti-29-shun-shi-zhen-da-yin-ju-zhen-she-di

思路 2:旋转矩阵

将矩阵第一行的元素添加到 res 列表里,删除第一行(也就是 matrix 中的第一个列表),然后逆时针旋转(这里通过转置+倒序实现),新的 matrix 的第一行即为接下来要打印的元素。

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        res = []
        while matrix:
            res += matrix.pop(0)
            matrix = list(zip(*matrix))[::-1]
        return res

代码来源:shan-chu-di-yi-xing-ni-shi-zhen-xuan-zhuan-python5

你可能感兴趣的:(今天刷题了吗)