54. 螺旋矩阵(定义四个方向然后遍历类)

发布时间:2026/8/3 20:07:16
54. 螺旋矩阵(定义四个方向然后遍历类) 文章目录54. 螺旋矩阵59. 螺旋矩阵 IILCR 146. 螺旋遍历二维数组(剑指offer29题54. 螺旋矩阵54. 螺旋矩阵给你一个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.lengthn matrix[i].length1 m, n 10-100 matrix[i][j] 100思路 按照顺时针遍历矩阵将二维矩阵看成一维矩阵遍历每个元素当索引越界或者元素已经被访问过则改变方向改变方向顺序为右下左上。Go代码funcspiralOrder(matrix[][]int)[]int{/*剑指offer 面试题29p161,ACWing 40 按照顺时针遍历矩阵将二维矩阵看成一维矩阵遍历每个元素当索引越界或者元素已经被访问过则改变方向 改变方向顺序为右下左上*/iflen(matrix)0||len(matrix[0])0{return[]int{}}res:make([]int,len(matrix)*len(matrix[0]))// 定义四个方向 上右下左 (上即行号减一右即列号加1以此类推)dx:[]int{-1,0,1,0}dy:[]int{0,1,0,-1}x,y,d:0,0,1// 从起点开始往右移动// 定义是否访问过的数组并初始化isVisited:make([][]bool,len(matrix))fori,_:rangeisVisited{isVisited[i]make([]bool,len(matrix[0]))}fori:0;ilen(matrix)*len(matrix[0]);i{res[i]matrix[x][y]// 当前节点加入结果数组isVisited[x][y]true// 标记当前节点已经访问过// 继续遍历下一个节点但需要用下临时变量不要用x x dx[d],因为等下可能还要用到原xa:xdx[d]b:ydy[d]// 如果当前节点越界了或者已经遍历过了则可以换方向了ifa0||alen(matrix)||b0||blen(matrix[0])||isVisited[a][b]{d(d1)%4// 新方向算出的下一个节点坐标用到了原x,yaxdx[d]bydy[d]}// 已经明确找到下一个节点位置了可以继续遍历了xa yb}returnres}59. 螺旋矩阵 II59. 螺旋矩阵 II给你一个正整数n生成一个包含1到n^2所有元素且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。示例 1输入n3输出[[1,2,3],[8,9,4],[7,6,5]]示例 2输入n1输出[[1]]提示1 n 20Go代码funcgenerateMatrix(nint)[][]int{/*思路和54题完全一样*/ifn0{return[][]int{}}// 定义相关切片并初始化res:make([][]int,n)isVisited:make([][]bool,n)fori:0;in;i{res[i]make([]int,n)isVisited[i]make([]bool,n)}// 定义四个方向 右下左上右边就是列号加1以此类推dx:[]int{0,1,0,-1}dy:[]int{1,0,-1,0}x,y,d:0,0,0// 起点和初始方向向右fori:1;in*n;i{res[x][y]i isVisited[x][y]truea:xdx[d]b:ydy[d]// 越界了或者已经访问过了可以换方向了ifa0||an||b0||bn||isVisited[a][b]{d(d1)%4axdx[d]bydy[d]}xa yb}returnres}LCR 146. 螺旋遍历二维数组(剑指offer29题LCR 146. 螺旋遍历二维数组(剑指offer29题给定一个二维数组array请返回「螺旋遍历」该数组的结果。螺旋遍历从左上角开始按照 向右、向下、向左、向上 的顺序 依次 提取元素然后再进入内部一层重复相同的步骤直到提取完所有元素。示例 1输入array[[1,2,3],[8,9,4],[7,6,5]]输出[1,2,3,4,5,6,7,8,9]示例 2输入array[[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]输出[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]限制0 array.length 1000 array[i].length 100注意本题与主站 54 题相同https://leetcode-cn.com/problems/spiral-matrix/Go代码funcspiralArray(array[][]int)[]int{/* 按照顺时针遍历矩阵将二维矩阵看成一维矩阵遍历每个元素当索引越界或者元素已经被访问过则改变方向 改变方向顺序为右下左上 */iflen(array)0||len(array[0])0{return[]int{}}res:make([]int,len(array)*len(array[0]))// 定义方向右下左上dx:[]int{0,1,0,-1}dy:[]int{1,0,-1,0}x,y,d:0,0,0// 起始位置和其实方向向右// 记录位置是否访问过isVisited:make([][]bool,len(array))fori:0;ilen(isVisited);i{isVisited[i]make([]bool,len(array[0]))}fori:0;ilen(array)*len(array[0]);i{res[i]array[x][y]isVisited[x][y]truea,b:xdx[d],ydy[d]// 下一个需要遍历的位置ifa0||alen(array)||b0||blen(array[0])||isVisited[a][b]{d(d1)%4axdx[d]bydy[d]}x,ya,b}returnres}