剑指 Offer 29. 顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例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
思路
我们先设置一个和方向相关的二维数组dir,然后从(0,0)下标开始遍历数组,输出所有到达的数字。在遍历的过程中,如果碰到边界或者已经走过的地方,就改变前进的方向,等走完所有的地方,就直接结束循环
时间复杂度:O(nm)
空间复杂度:O(nm)
代码
import java.util.ArrayList;
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix.length == 0) return new int[0];
List<Integer> list = new ArrayList();
boolean map[][] = new boolean[100][100];
int n = matrix.length;
int m = matrix[0].length;
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
map[i][j] = true;
}
}
int l[] = new int[]{0, 1, 0, -1};
int r[] = new int[]{1, 0, -1, 0};
int x = 0, y = 0, num = 0, ans = 1;
list.add(matrix[0][0]);
map[0][0] = false;
while(ans < n * m){
boolean flag = true;
if (x + l[num] < n && x + l[num] >= 0){
if (y + r[num] < m && y + r[num] >= 0){
if (map[x + l[num]][y + r[num]]){
x += l[num];
y += r[num];
list.add(matrix[x][y]);
map[x][y] = false;
ans++;
}else{
flag = false;
}
}else{
flag = false;
}
}else{
flag = false;
}
if (!flag){
num++;
num %= 4;
}
}
int[] k = new int[list.size()];
for (int i = 0; i < list.size(); i++){
k[i] = list.get(i);
}
return k;
}
}