• 【LeetCode】54. 螺旋矩阵


    1 问题

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

    2 答案

    这题直接不会

    再次尝试修改

    class Solution:
        def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
            up = 0
            down = len(matrix) - 1
            left = 0
            right = len(matrix[0]) - 1
            res = []
            curx = 0
            cury = 0
            move = [(1,0), (0,1), (-1,0), (0,-1)]
            add = 0
            # 从结果出发,去寻找while的条件比较容易
            while len(res) != (len(matrix)) * (len(matrix[0])):
                res.append(matrix[cury][curx])
                if curx == right and cury == up and add == 0:                
                    up += 1
                    add += 1
                if cury == down and curx == right and add == 1:
                    right -= 1
                    add += 1
                if curx == left and cury == down and add == 2:
                    down -= 1
                    add += 1
                if cury == up and curx == left and add == 3:
                    left += 1
                    add += 1
                add %= 4
                curx+=move[add][0]
                cury+=move[add][1]
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    官方解, 顺时针旋转矩阵:先转置,再上下翻转。逆时针旋转矩阵:先上下翻转,再转置。

    class Solution:
        def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
            res = []
            while matrix:
                res += matrix.pop(0)  # pop 默认返回最后一个元素
                matrix = list(map(list, zip(*matrix)))[::-1]  # [::-1] 上下翻转
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    https://leetcode.cn/problems/spiral-matrix/solutions/24232/na-yi-xing-ni-shi-zhen-zhuan-yi-xia-by-suixin-3/

    也可以直接遍历,但要确定好边界,遍历方向等细节问题

    class Solution(object):
        def spiralOrder(self, matrix):
            M, N = len(matrix), len(matrix[0])
            left, right, up, down = 0, N - 1, 0, M - 1
            res = []
            x, y = 0, 0
            dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]
            cur_d = 0
            while len(res) != M * N:
                res.append(matrix[x][y])
                if cur_d == 0 and y == right:
                    cur_d += 1
                    up += 1
                elif cur_d == 1 and x == down:
                    cur_d += 1
                    right -= 1
                elif cur_d == 2 and y == left:
                    cur_d += 1
                    down -= 1
                elif cur_d == 3 and x == up:
                    cur_d += 1
                    left += 1
                cur_d %= 4  # 4个方向,所以是4
                x += dirs[cur_d][0]
                y += dirs[cur_d][1]
            return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    https://leetcode.cn/problems/spiral-matrix/solutions/656925/ju-zhen-bian-li-wen-ti-de-si-bu-qu-by-fu-91za/

  • 相关阅读:
    直接插入排序算法详解之C语言版
    岭回归与LASSO回归:解析两大经典线性回归方法
    【内网安全】——windows信息收集
    IOday8
    【Spark | RDD】架构及算子的基本认识
    eMMC编程基础 -(二)eMMC基础介绍
    【AGC】如何创建自定义应用内消息
    pyinstaller打包完整python项目
    Redis7-分布式锁
    【开发神器】自动化测试、用 Apipost!
  • 原文地址:https://blog.csdn.net/CSDNLHCC/article/details/133940425