题目:
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。

8574583EEC87819F1F92E552BD04B90A.png

//自己没有想出来,看了优秀答案,理解了半天才看懂
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]