一、题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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) 使用了一个矩阵记录是否访问过