LeetCode - - 54.螺旋矩阵

    xiaoxiao2022-07-06  204

    给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

    示例 1:

    输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5]

    示例 2:

    输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]

     


    对于这道题,我把矩阵分为多个圈(一个圈包括上、右、下、左四个部分),然后一个圈一个圈遍历(一个圈用四个for循环进行遍历),过程如下图(注意:一个圈只有一行或者一列的情况):

              

    具体java代码如下:

    class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> list = new ArrayList<Integer>();//用于储存遍历的元素 if(matrix.length==0)//如果数组为空,直接返回一个空list return list; int row = matrix.length;//行 int col = matrix[0].length;//列 //注意:a>>n相当于a除于2ⁿ,a<<n相当于a乘于2ⁿ int circleSum = (((row>col?col:row)-1)>>1)+1;//总圈数=(min(row,col)-1)/2+1 int circle = 0;//第几圈 while(circle<circleSum){ for(int h = circle;h<col-circle;h++)//上遍历 list.add(matrix[circle][h]); if(row-(circle<<1)==1)//当前圈只有一行时,上遍历之后就跳出while循环 break; for(int i = circle+1;i<row-circle;i++)//右遍历 list.add(matrix[i][col-circle-1]); if(col-(circle<<1)==1)//当前圈只有一列时,上遍历及右遍历之后就跳出while循环 break; for(int j = col-circle-2;j>=circle;j--)//下遍历 list.add(matrix[row-circle-1][j]); for(int k = row-circle-2;k>=circle+1;k--)//左遍历 list.add(matrix[k][circle]); circle++; } return list; } }

     

    最新回复(0)