目录
一、题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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) 使用了一个矩阵记录是否访问过
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/125060.html