首页 > 其他分享 >0054_Spiral-Matrix【M】

0054_Spiral-Matrix【M】

时间:2024-07-23 13:26:29浏览次数:17  
标签:right Matrix matrix bottom res top Spiral 0054 jy

1、基于矩阵 4 个边界指针实现

  • 顺时针顺序一层层遍历,共需遍历math.ceil(min(m, n) / 2)
from typing import List, Dict


class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        """
        以示例 2 中的数组为例进行思考:
        [ [1, 2, 3, 4],
          [5, 6, 7, 8],
          [9,10,11,12]]
        """
        import math

        if not matrix:
            return []
            
        result = []
        # jy: m 行 n 列
        m, n = len(matrix), len(matrix[0])
        # jy: 共需遍历 math.ceil(min(m, n) / 2) 圈
        for i in range(math.ceil(min(m, n) / 2)):
            # jy: 遍历第 i 圈的上面一排 (从左往右)
            for j in range(i, n-i):
                result.append(matrix[i][j])

            # jy: 遍历第 i 圈的右边一列 (从上往下)
            for j in range(i+1, m-i):
                result.append(matrix[j][n-i-1])

            # jy: 遍历第 i 圈的下面一排 (从右往左, 因此需倒序遍历)
            #     注意: 如果去除该 if 判断, 则示例 2 中的矩阵的输出结果为:
            #     [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7, 6] (最后多了一个 6)
            if i != m-i-1:
                for j in range(n-i-2, i-1, -1):
                    result.append(matrix[m-i-1][j])

            # jy: 遍历第 i 圈的左边一列 (从下往上, 因此需倒序遍历)
            #     注意: 如果去除该 if 判断, 则 matrix = [[7], [9], [6]] 时
            #     输出结果为: [7, 9, 6, 9]
            if i != n-i-1:
                for j in range(m-i-2, i, -1):
                    result.append(matrix[j][i])
        return result


matrix = [
 [1, 2, 3, 4],
 [5, 6, 7, 8],
 [9,10,11,12]]
res = Solution().spiralOrder(matrix)
# jy: [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]
print(res)

2、基于 4 个边界指针

  • 基于 4 个边界指针进行遍历,时间复杂度O(m * n),空间复杂度O(1)
  • 顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环,因此可设定矩阵的 “左、上、右、下” 四个边界,模拟以上矩阵遍历顺序
  • 算法流程:
    • matrix为空时,直接返回空列表[]
    • 初始化矩阵 “左、右、上、下” 四个边界leftrighttopbottom,结果列表ls_res
    • 循环打印:“从左向右、从上向下、从右向左、从下向上” 四个方向循环打印
      • 根据边界打印,将元素按顺序添加至列表ls_res尾部
      • 边界向内收缩 1(代表已被打印)
      • 判断边界是否相遇(是否打印完毕),若打印完毕则跳出
    • 返回ls_res即可
from typing import List, Dict


class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix:
            return []

        # jy: 初始化边界下标
        left = 0
        right = len(matrix[0]) - 1
        top = 0 
        bottom = len(matrix) - 1
        # jy: 存放遍历结果
        ls_res = []
        while True:
            # jy: 从左到右打印 (left to right)
            for i in range(left, right + 1):
                ls_res.append(matrix[top][i])
            # jy: 打印完一圈之后, top 边界向内收缩 1 (top 往下走)
            top += 1
            # jy: 如果收缩后 top 边界大于 bottom 边界, 则退出循环
            if top > bottom:
                break

            # jy: 从上到下打印 (top to bottom), 打印完后 right 边界向内收缩 1
            #     (right 往左走), 如果收缩后 left 边界大于 right, 则退出循环
            for i in range(top, bottom + 1):
                ls_res.append(matrix[i][right])
            right -= 1
            if left > right:
                break

            # jy: 从右到左打印 (right to left), 打印完后 bottom 边界向内收缩 1
            #     (bottom 往上走), 如果收缩后 top 边界大于 bottom, 则退出循环
            for i in range(right, left - 1, -1):
                ls_res.append(matrix[bottom][i]) 
            bottom -= 1
            if top > bottom:
                break

            # jy: 从下到上打印 (bottom to top), 打印完后 left 边界向内收缩 1
            #     (left 往右走), 如果收缩后 left 边界大于 right, 则退出循环
            for i in range(bottom, top - 1, -1):
                ls_res.append(matrix[i][left])
            left += 1
            if left > right:
                break

        return ls_res


matrix = [
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]]
res = Solution().spiralOrder(matrix)
# jy: [1, 2, 3, 6, 9, 8, 7, 4, 5]
print(res)

3、基于 zip 内置函数与列表倒序实现

from typing import List, Dict


class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        """
        以如下矩阵为例进行说明:
        [[1, 2, 3, 4],
         [5, 6, 7, 8],
         [9,10,11,12]]
        """
        result = []
        while matrix:
            # jy: 取出矩阵第一行; 注意: [1, 2, 3, 4] 不能直接与 (8, 12) 相加,
            #     即如果 a = [1, 2, 3, 4], b = (8, 12), 则执行 a = a + b 时会
            #     报错, 但执行 a += b 时可正常执行, 且结果为: [1, 2, 3, 4, 8, 12] 
            result += matrix.pop(0)
            # jy: 旋转矩阵, 当 matrix 为如下矩阵时:
            #     [[5, 6, 7, 8],
            #      [9,10,11,12]]
            #     list(zip(*matrix)) 的结果为:
            #     [(5, 9), (6, 10), (7, 11), (8, 12)]
            #     倒序后结果为: 
            #     [(8, 12), (7, 11), (6, 10), (5, 9)]
            # jy: 当 matrix 为 [(7, 11), (6, 10), (5, 9)] 时:
            #     list(zip(*matrix)) 的结果为:
            #     [(7, 6, 5), (11, 10, 9)]
            #     倒序后结果为:
            #     [(11, 10, 9), (7, 6, 5)]
            matrix = list(zip(*matrix))[::-1] 
        return result


matrix = [ 
 [1, 2, 3, 4],
 [5, 6, 7, 8],
 [9,10,11,12]]
res = Solution().spiralOrder(matrix)
# jy: [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]
print(res)

标签:right,Matrix,matrix,bottom,res,top,Spiral,0054,jy
From: https://blog.csdn.net/m0_66491750/article/details/140633463

相关文章

  • 0059_Spiral-Matrix-ii【M】
    JY:矩阵的螺旋遍历相似题:0054_Spiral-Matrix【M】参考:0059_Spiral-Matrix-ii【M】 1、基于4个边界指针参考0054_Spiral-Matrix【M】中的解法2classSolution:defgenerateMatrix(self,n:int)->[[int]]:left,right,top,bottom=0,n-1,0,n......
  • Vova Escapes the Matrix
    做的时候就差如何得出一个点到两个不同的出口的最短路和次短路了啊分类讨论如果图不能到达出口,那么可以把所有'.'都填了如果图只能达到一个出口,那么就是所有'.'的个数减去起点到这个出口的最短路如果图可以到达两个及以上出口,考虑填满陷阱之后,图长成什么样子:此时一定刚好还剩......
  • G. A/B Matrix
    原题链接题解每行有a个,所以总共有\(n\cdota\)个每列有b个,所以总共有\(m\cdotb\)个所以要满足\(na=mb\)想象一下这个场景:每一行,每次往当前列中,最左端的一最少的列的开始连续放置1code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;voids......
  • [LeetCode] 1380. Lucky Numbers in a Matrix
    Givenanmxnmatrixofdistinctnumbers,returnallluckynumbersinthematrixinanyorder.Aluckynumberisanelementofthematrixsuchthatitistheminimumelementinitsrowandmaximuminitscolumn.Example1:Input:matrix=[[3,7,8],[9,11,......
  • manim边学边做--Matrix
    在代数问题中,矩阵是必不可少的工具,manim中提供了一套展示矩阵(Matrix)的模块,专门用于在动画中显示矩阵格式的数据。关于矩阵的类主要有4个:Matrix:通用的矩阵IntegerMatrix:元素是整数的矩阵DecimalMatrix:元素包含小数的矩阵MobjectMatrix:元素可以是图形的矩阵其实IntegerMatrix......
  • 机器学习分类结果精度测定 - 混淆矩阵(Confusion Matrix)
    一、引言机器学习和数据科学中一个经常被忽视,但至关重要的概念是模型评估。你可能已经建立了一个非常先进的模型,但如果没有合适的评估机制,你就无法了解模型的效能和局限性。这就是混淆矩阵(ConfusionMatrix)派上用场的地方。1.1什么是混淆矩阵?混淆矩阵是一种特定的表格布局......
  • [ARC115B] Plus Matrix 的题解
    题目大意给你一个\(n\timesn\)的数组\(C\),\(c_{i,j}=a_i+b_j\),求\(a\)数组与\(b\)数组,不保证有解,其中\(1\len\le500,1\lec_{i,j}\le10^9\),而且\(a_i,b_i\)都是非负整数。\[\begin{bmatrix}a_1+b_1&a_1+b_2&\cdots&a_1+b_{n-1}&a_1+b_n\\a_2+b_......
  • 用StabilityMatrix一键安装Stable Diffusion
    StableDiffusion是2022年发布的深度学习文字到图像生成模型,它既能免费使用,又能部署在本地端,又有非常多的模型可以直接套用,在使用体验上比Midjourney和DALL-E更加强大。StableDiffusion使用的模型有下列几大类,对照模型网站https://civitai.com以形成更直观的认识:BaseModel:Sta......
  • qoj5371 Matrix (二分图匹配)
    qoj5371Matrix二分图匹配判断无解的情况,当且仅当有\(a_{i,j}\)为负数或每一行和每一列的和不相同时无解。因为\(m\leN^2\),所以我们只需要每一次至少完成一个\(a_{i,j}\)即可。观察\(B\)矩阵的形成,实际上就是一个\(i\)行只能和一个\(j\)列匹配,跑二分图匹配即可。每......
  • 如何应用 matrix3d 映射变幻
    如何应用matrix3d映射变幻先上demo记得是在2015看到过的一个html5演示效果,很惊艳当时没明白如何实现,现在我会了,做一个类似的:又弄了一个拖动的demo我数学真的很差“你好老师!学这个矩阵具体有什么用?”老师喝着水貌似想了一会儿回答:“考试用”..这个问题我真问过......