题解 | #螺旋矩阵#
螺旋矩阵
http://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31
import java.util.ArrayList;
public class Solution {
// 四中状态的
enum Status {
LeftToRight, TopToBottom, RightToLeft, BottomToTop
}
private int[][] init(int row, int col) {
int[][] visited = new int[row][col];
for (int i = 0; i < visited.length; i++) {
for (int j = 0; j < visited[0].length; j++) {
visited[i][j] = 0; // unvisited
}
}
return visited;
}
private boolean hasUnVisitedElement(int[][] visited) {
for (int i = 0; i < visited.length; i++) {
for (int j = 0; j < visited[0].length; j++) {
if (visited[i][j] == 0) return true;
}
}
return false;
}
public ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> result = new ArrayList<>();
if(matrix.length==0) return result;
else if(matrix.length == 1){
for (int i = 0; i < matrix[0].length; i++) {
result.add(matrix[0][i]);
}
return result;
}
// 定义状态序列
Status[] arrs = new Status[]{Status.LeftToRight, Status.TopToBottom, Status.RightToLeft, Status.BottomToTop};
int currentStatus = 0; // 定义状态指针
// 初始化访问矩阵
int[][] visited = init(matrix.length, matrix[0].length);
int left = -1, right = matrix[0].length, top = -1, bottom = matrix.length;
// 还有未访问的就继续
while (hasUnVisitedElement(visited)) {
switch (arrs[currentStatus]) {
case LeftToRight:
left++;
top++;
for (int i = left; i < right - 1; i++) {
if(visited[top][i] == 0){
result.add(matrix[top][i]);
visited[top][i] = 1; // 访问过
}
}
break;
case TopToBottom:
right--;
bottom--;
for (int i = top; i < bottom; i++) {
if(visited[i][right] == 0){
result.add(matrix[i][right]);
visited[i][right] = 1;
}
}
break;
case RightToLeft:
for (int i = right; i > left - 1; i--) {
if(visited[bottom][i] == 0){
result.add(matrix[bottom][i]);
visited[bottom][i] = 1;
}
}
break;
case BottomToTop:
for (int i = bottom - 1; i > top; i--) {
if(visited[i][left] == 0){
result.add(matrix[i][left]);
visited[i][left] = 1;
}
}
break;
}
currentStatus = (currentStatus + 1) % arrs.length;
}
return result;
}
}值得注意的是,需要导入ArrayList的包才行。
查看12道真题和解析