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