题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
样例
输入:
[ [1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]输出:[1,2,3,4,8,12,11,10,9,5,6,7]
算法
(模拟) O(n^2)
我们顺时针定义四个方向:上右下左。
从左上角开始遍历,先往右走,走到不能走为止,然后更改到下个方向,再走到不能走为止,依次类推,遍历 n^2 个格子后停止。
时间复杂度
矩阵中每个格子遍历一次,所以总时间复杂度是 O(n^2)。
class Solution {
public int[] printMatrix(int[][] matrix) {
ArrayList<Integer> res = new ArrayList();
int n = matrix.length;
if(n == 0) return res.stream().mapToInt(Integer::valueOf).toArray();
//必须写在判断n是否为0的下面,否咋会报空指针异常
int m = matrix[0].length;
//上右下左
int[] dx = {-1,0,1,0},dy={0,1,0,-1};
boolean[][] st = new boolean[n][m];
int x = 0,y = 0,d = 1;
for(int k = 0;k < m*n;k++){
res.add(matrix[x][y]);
st[x][y] = true;
int a = x + dx[d],b = y + dy[d];
//判断越界改变方向
if(a < 0 || a >= n || b < 0 || b >=m || st[a][b]){
d = (d + 1) % 4;
a = x + dx[d];
b = y + dy[d];
}
x = a;
y = b;
}
//将Integer类型的ArrayList转化为数组
return res.stream().mapToInt(Integer::valueOf).toArray();
}
}