leetCode 54. 螺旋矩阵

54. 螺旋矩阵

题解:java 模拟 注释详细 逻辑简单 时间击败100%

原题描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

leetCode 54. 螺旋矩阵_第1张图片

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

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

示例 2:

leetCode 54. 螺旋矩阵_第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]

解题方法

1.遍历前准备,初始化相关变量,和确定遍历条件。

//初始化变量
List ans = new ArrayList<>();
int x=0,y=0,h=matrix.length-1,w=matrix[0].length-1;
//遍历条件
while (x<=w&&y<=h){
 // 旋转打印数组
}

2.遍历顶部第y行,由左向右

//up由左向右
for (int i = x; i <=w ; i++) {
    ans.add(matrix[y][i]);
}
//第y行已经遍历过 
y++;

3.遍历右边第w列,由上向下

//right 由上向下
for (int i = y; i <=h ; i++) {
    ans.add(matrix[i][w]);
}
 //第w列已经遍历过 
 w--;

4.遍历底部h行,条件 h>=y,顶部已经遍历的就不再遍历, 由由向左

 //down 由由向左
 for (int i = w; i >=x &&h>=y ; i--) {
    ans.add(matrix[h][i]);
 }
  //第h行已经遍历过 
h--;

5.遍历左边x行,条件x<=w 右边已经遍历过的不再遍历,由下向上

//left 由下向上
for (int i = h; i >=y&&x<=w ; i--) {
    ans.add(matrix[i][x]);
}
 //第x列已经遍历过 
 x++;

复杂度

  • 时间复杂度: O(n)

  • 空间复杂度: O(n)

Code

class Solution {
   public  List spiralOrder(int[][] matrix) {
        List ans = new ArrayList<>();
        int x=0,y=0,h=matrix.length-1,w=matrix[0].length-1;
        while (x<=w&&y<=h){
            //up由左向右
            for (int i = x; i <=w ; i++) {
                ans.add(matrix[y][i]);
            }
           //第y行已经遍历过 
            y++;
            //right 由上向下
            for (int i = y; i <=h ; i++) {
                ans.add(matrix[i][w]);
            }
            //第w列已经遍历过 
            w--;
            //down 由右向左
            for (int i = w; i >=x &&h>=y ; i--) {
                ans.add(matrix[h][i]);
            }
         //第h行已经遍历过 
            h--;
            //left 由下向上
            for (int i = h; i >=y&&x<=w ; i--) {
                ans.add(matrix[i][x]);
            }
          //第x列已经遍历过 
            x++;
        }
        return ans;
    }
}

执行效果

leetCode 54. 螺旋矩阵_第3张图片

你可能感兴趣的:(leetcode刷题,矩阵,算法,java,leetcode)