54. 螺旋矩阵

  1. 题目链接

  2. 解题思路:宏观思路,一圈一圈打,确定好「一圈」的左上角以及右下角,然后再打印。有两种特殊情况,左上角和右上角的列相等时,只需要打一行即可;左上角的列和右下角的列相等时,只需打印一列即可。

  3. 代码:

    from typing import List
    class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
    n = len(matrix)
    m = len(matrix[0])
    ans = []
    begin_r = 0
    begin_c = 0
    end_r = n - 1
    end_c = m - 1
    while begin_r <= end_r and begin_c <= end_c: # 一圈一圈打印
    if begin_r == end_r: # 只需要打印一行
    tmp = begin_c
    while tmp <= end_c:
    ans.append(matrix[begin_r][tmp])
    tmp += 1
    break
    if begin_c == end_c: # 只需打印一列
    tmp = begin_r
    while tmp <= end_r:
    ans.append(matrix[tmp][end_c])
    tmp += 1
    break
    # 上
    tmp = begin_c
    while tmp <= end_c:
    ans.append(matrix[begin_r][tmp])
    tmp += 1
    # 右
    tmp = begin_r + 1
    while tmp <= end_r:
    ans.append(matrix[tmp][end_c])
    tmp += 1
    # 下
    tmp = end_c - 1
    while tmp >= begin_c:
    ans.append(matrix[end_r][tmp])
    tmp -= 1
    # 左
    tmp = end_r - 1
    while tmp > begin_r:
    ans.append(matrix[tmp][begin_c])
    tmp -= 1
    # 打印完一圈后,更新左上角点 和右下角点
    begin_r += 1
    begin_c += 1
    end_r -= 1
    end_c -=1
    return ans
posted @   ouyangxx  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示