题目:
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
//自己没有想出来,看了优秀答案,理解了半天才看懂
import java.util.*;
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
//定义一个数组,用来放返回值
ArrayList<Integer> res=new ArrayList<>();
if(matrix.length==0){
return res;
}
//初始化行走方向,默认flag=1;flag=1->向右;flag=2->向下;flag=3->向左;flag=4->向上
int flag=1;
//标记走过的点,默认初始化为false
boolean[][] vis=new boolean[matrix.length][matrix[0].length];
//初始化横坐标和纵坐标
int x=0;
int y=0;
//返回数组的元素小于入参数组时,继续循环
while (res.size()<matrix.length*matrix[0].length){
//当越界或者改点已经走过
if(x<0||y>=matrix[0].length||y<0|| x>= matrix.length||vis[x][y]){
if(flag==1){
//下一步,往下走
flag=2;
//越界后,横坐标回退一位
y--;
//下一步的点,纵坐标应该向下移一位
x++;
}else if(flag==2){
//下一步,往左走
flag=3;
//越界后,纵坐标应该向上移一位
x--;
//横坐标向左移一位
y--;
}else if(flag==3){
//下一步,往上走
flag=4;
//越界后,横坐标向右移一位
y++;
//纵坐标向上移一位
x--;
}else{
//下一步,往右走
flag=1;
//越界后,纵坐标向下移一位
x++;
//横坐标向右移一位
y++;
}
}else {
res.add(matrix[x][y]);
//标记已经走过的位置
vis[x][y]=true;
//根据flag的值,更新x,y下标的值
if(flag==1){
y++;
}else if(flag==2){
x++;
}else if(flag==3){
y--;
}else {
x--;
}
}
}
return res;
}
}
输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]