54. 螺旋矩阵

54. 螺旋矩阵

  • 题目
  • 示例
  • 1. 暴力
  • 2. 逻辑方法
  • 3. 削头旋转

题目

给你一个 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]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1. 暴力

执行用时:12 m, 在所有 Python 提交中击败了92.76%的用户
内存消耗:12.9 MB, 在所有 Python 提交中击败了83.86%的用户
通过测试用例:25 / 25

class Solution:
    def spiralOrder(self, matrix):
        m,n,k = len(matrix), len(matrix[0]), 0
        total = m * n
        li = []
        while len(li) <= total:
            for i in range(k,n-k):
                li.append(matrix[k][i])
            if len(li) >= total:
                break
            for i in range(k+1,m-k):
                li.append(matrix[i][n-k-1])
            if len(li) >= total:
                break
            for i in range(n-k-2,k-1,-1):
                li.append(matrix[m-k-1][i])
            if len(li) >= total:
                break
            for i in range(m-k-2,k,-1):
                li.append(matrix[i][k])
            if len(li) >= total:
                break
            k += 1
        return li

2. 逻辑方法

执行用时:16 ms, 在所有 Python 提交中击败了71.34%的用户
内存消耗:13 MB, 在所有 Python 提交中击败了69.68%的用户
通过测试用例:
25 / 25

class Solution(object):
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        lm, lmm = len(matrix),len(matrix[0])
        total = lm*lmm
        i,j = 0,0
        visited = []
        ni,nj = 0,1
        # ni  nj   方向
        #  0   1    右
        #  1   0    下
        #  0  -1    左
        # -1   0    上
        while len(visited) < total:
            # 添加元素
            visited.append((i,j))
            # 如果当前i或者j到达头尾部,则进行更换
            if ((i+ni)%lm,(j+nj)%lmm) in visited:
                ni,nj = nj,-ni
            i += ni
            j += nj
        return [matrix[m][n] for m,n in visited]

3. 削头旋转

执行用时:24 ms, 在所有 Python 提交中击败了12.37%的用户
内存消耗:13 MB, 在所有 Python 提交中击败了55.96%的用户
通过测试用例:25 / 25

–从力扣搬运的代码–

class Solution(object):
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        res = []
        while matrix:
        	# 获取头行
            res += matrix.pop(0)
            # 旋转列表
            matrix = zip(*matrix)[::-1]
        return res

你可能感兴趣的:(算法,矩阵,算法,python,leetcode)