剑指 Offer 第29题:顺时针打印矩阵
2022-07-19 本文已影响0人
放开那个BUG
1、前言
![](https://img.haomeiwen.com/i11345146/48c7b33b4d6ff9a6.png)
2、思路
没什么别的好办法,就是模拟上下左右的运动,一般满了就可以提前判断退出
3、代码
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix == null || matrix.length == 0){
return new int[]{};
}
// 1,2,3,1
// 4,5,6,1
// 7,8,9,1
int m = matrix.length, n = matrix[0].length;
int[] res = new int[m * n];
boolean[][] visited = new boolean[m][n];
int i = 0, j = 0, index = 0;
while(!visited[i][j] || index < m * n){
// 左到右
while(j < n && !visited[i][j]){
visited[i][j] = true;
res[index++] = matrix[i][j++];
}
if(index >= m * n){
break;
}
j--;
i++;
// 上到下
while(i < m && !visited[i][j]){
visited[i][j] = true;
res[index++] = matrix[i++][j];
}
if(index >= m * n){
break;
}
j--;
i--;
// 右到左
while(j >= 0 && !visited[i][j]){
visited[i][j] = true;
res[index++] = matrix[i][j--];
}
if(index >= m * n){
break;
}
j++;
i--;
// 下到上
while(i >= 0 && !visited[i][j]){
visited[i][j] = true;
res[index++] = matrix[i--][j];
}
if(index >= m * n){
break;
}
i++;
j++;
}
return res;
}
}