问题描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
方法一
思路
设置一个和matrix大小一样的辅助数组,记录元素有没有访问过。元素的遍历顺序是从左向右,从上到下,从右到左,从下到上。
代码
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) return new int[0];
int n = matrix.length;
int m = matrix[0].length;
int[] res = new int[n*m];
int idx = 0;
boolean[][] isVisited = new boolean[n][m];
int i = 0, j = 0;
res[idx++] = matrix[0][0];
isVisited[0][0] = true;
while(idx < n*m) {
while(j+1 < m) {
if(isVisited[i][j+1]) {
break;
} else {
res[idx++] = matrix[i][++j];
isVisited[i][j] = true;
}
}
while(i+1 < n) {
if(isVisited[i+1][j]) {
break;
} else {
res[idx++] = matrix[++i][j];
isVisited[i][j] = true;
}
}
while(j-1 >= 0) {
if(isVisited[i][j-1]) {
break;
} else {
res[idx++] = matrix[i][--j];
isVisited[i][j] = true;
}
}
while(i-1 >= 0) {
if(isVisited[i-1][j]) {
break;
} else {
res[idx++] = matrix[--i][j];
isVisited[i][j] = true;
}
}
}
return res;
}
}
方法二
思路
其实用不了一个数组来记录,用四个变量来记录边界就可以了。
代码
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) return new int[0];
int l = 0, r = matrix[0].length-1, t = 0, b = matrix.length-1;
int resLength = (r+1)*(b+1);
int[] res = new int[resLength];
int idx = 0;
while(true) {
for(int i = l; i <= r; i++) {
res[idx++] = matrix[t][i];
}
if(++t > b) break;
for(int i = t; i <= b; i++) {
res[idx++] = matrix[i][r];
}
if(--r < l) break;
for(int i = r; i >= l; i--) {
res[idx++] = matrix[b][i];
}
if(--b < t) break;
for(int i = b; i >= t; i--) {
res[idx++] = matrix[i][l];
}
if(++l > r) break;
}
return res;
}
}