顺时针打印矩阵(剑指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)        使用了一个矩阵记录是否访问过


相关文章
|
7月前
|
人工智能 Java 大数据
Java程序员真的还有未来吗?如何备战2024春招?并狂拿大厂offer?
Java程序员还有未来吗? 嘿,小伙伴们,你们有没有想过Java程序员还有没有未来? 哈哈,别担心,我这就来给你们答疑解惑! 首先,让我们来看看Java的发展历程。自从Java诞生以来,它就一直是编程界的一颗璀璨明星。从Web应用到企业级应用,再到移动应用,Java无处不在。那么,现在呢?现在,随着人工智能、大数据和云计算的兴起,Java依然发挥着重要的作用。这些领域都需要大量的Java程序员来支持它们的发展。 那么,有人会说:“哎呀,现在出现了那么多新的编程语言和框架,Java程序员会不会被淘汰啊?”哈哈,别担心,Java程序员们!这些新语言和框架的出现并不会让Java消失。相反,它们
148 0
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
57 6
|
6月前
|
Java
剑指offer_3_前n个数字二进制形式中1的个数(java)
剑指offer_3_前n个数字二进制形式中1的个数(java)
|
6月前
|
Java
剑指offer_2_二进制加法(java)
剑指offer_2_二进制加法(java)
|
6月前
|
Java
剑指offer_1_整数除法(java)
剑指offer_1_整数除法(java)
|
6月前
|
Java
基本矩阵运算的Java实现
基本矩阵运算的Java实现
40 0
|
7月前
|
存储 安全 Java
剑指offer全集系列Java版本(2)
剑指offer全集系列Java版本(2)
45 0
|
7月前
|
存储 Java
剑指offer全集系列Java版本(1)
剑指offer全集系列Java版本(1)
47 0
|
7月前
|
算法 Java C++
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
|
7月前
|
Rust 索引
Rust 编程小技巧摘选(5)
Rust 编程小技巧摘选(5)
85 0
Rust 编程小技巧摘选(5)