顺时针打印矩阵(剑指offer 29)Java

简介: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

一、题目描述



输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。


示例 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]


限制:

0 <= matrix.length <= 100

0 <= matrix[i].length <= 100


二、思路讲解



模拟遍历的过程,使用两个指针,当指针到达边界的时候,就转换方向。同时,每访问过一个指针,就将visited矩阵中对应位置标为1。如果当前节点已经访问,也要转换方向。


三、Java代码实现



class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length == 0){
            return new int[0];
        }
        int len = matrix.length * matrix[0].length;
    int i=0, j=0;
    int index=0;
    int []a = new int[len];
    int [][]visited = new int[matrix.length][matrix[0].length]; //记录是否访问过
    while(len > 0) {
      //向右
      while(j<matrix[0].length && visited[i][j]==0) {
        if(visited[i][j]==0) {
          a[index++] = matrix[i][j];
          len--;
          visited[i][j] = 1;        
          j++;
        } else {
          break;
        }
      }
      j--;
      i++;
      //向下
      while(i<matrix.length && visited[i][j]==0) {
        if(visited[i][j]==0) {
          a[index++] = matrix[i][j];
          len--;
          visited[i][j] = 1;
          i++;
        } else {
          break;
        }
      }
      i--;
      j--;
      //向左
      while(j>=0 && visited[i][j]==0) {
        if(visited[i][j]==0) {
          a[index++] = matrix[i][j];
          len--;
          visited[i][j] = 1;
          j--;
        } else {
          break;
        }
      }
      j++;
      i--;
      //向上
      while(i>=0 && visited[i][j]==0) {
        if(visited[i][j]==0) {
          a[index++] = matrix[i][j];
          len--;
          visited[i][j] = 1;
          i--;
        } else {
          break;
        }
      } 
      i++;
      j++;
    }
    return a;
    }
}


四、时空复杂度分析



时间复杂度:        O(MN)        遍历一整个矩阵


空间复杂度:        O(MN)        使用了一个矩阵记录是否访问过


相关文章
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
163 6
剑指offer_3_前n个数字二进制形式中1的个数(java)
剑指offer_3_前n个数字二进制形式中1的个数(java)
109 0
剑指offer_2_二进制加法(java)
剑指offer_2_二进制加法(java)
剑指offer_1_整数除法(java)
剑指offer_1_整数除法(java)
139 0
|
Java
基本矩阵运算的Java实现
基本矩阵运算的Java实现
79 0
|
存储 安全 Java
剑指offer全集系列Java版本(2)
剑指offer全集系列Java版本(2)
106 0
|
存储 Java
剑指offer全集系列Java版本(1)
剑指offer全集系列Java版本(1)
103 0
|
算法 Java C++
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
|
Rust 索引
Rust 编程小技巧摘选(5)
Rust 编程小技巧摘选(5)
164 0
Rust 编程小技巧摘选(5)
|
Java Go C++
Java每日一练(20230417) N 皇后、搜索二维矩阵、发奖金问题
Java每日一练(20230417) N 皇后、搜索二维矩阵、发奖金问题
92 0
Java每日一练(20230417) N 皇后、搜索二维矩阵、发奖金问题
下一篇
开通oss服务