先列举几种情况
图片说明
观察一下,思路其实可以归纳为从起点(0,0)开始
先往左走,没有办法往左走了(到了边界或者是左边的格子已经走过了)就往下走,
不能往下走了以后就往右走,
不能往右走了以后就往上走,
不能往上走了以后就往左走。
直到有一个格子四个方向都不能走了,就结束循环。
所以我们设立一个visit数组,visit[i][j]表示(i,j)位置之前有没有访问过
然后建立dir数组,来表示当前的方向,如果当前方向不能走了,用(t+1)%4就可以进行以上的变换了。
c++

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        vector<int> ans;
        int m = matrix.size();
        if(m==0){ return ans; }
        int n = matrix[0].size();
        if(n==0){ return ans; }
        vector<vector<bool> > visit(m);
        for(int i = 0 ; i < m ; i++) { visit[i].resize(n); }
        int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
        int t = 0;//走哪个方向,0右 1下 2左 3上
        int x = 0,y = 0;
        bool end = false;
        while(!end)
        {
            ans.push_back(matrix[x][y]);
            visit[x][y] = true;
            for(int i = 0 ; i < 5 ; i++)//如果现在的位置四个方向都不能走了,循环就可以结束了。
            {
                if(i == 4){end = true;break;}
                int tx = x + dir[t][0];
                int ty = y + dir[t][1];
                if(tx >= 0 && tx < m && ty >= 0 && ty < n && !visit[tx][ty])
                {
                    x = tx;
                    y = ty;
                    break;
                }
                else{//失败了,换方向走
                    t = (t+1)%4;
                }
            }
        }
        return ans;
    }
};

java

import java.util.*;
public class Solution {
    public ArrayList<Integer> spiralOrder(int[][] matrix) {
        ArrayList<Integer> ans = new ArrayList<Integer>();
        int m = matrix.length;
        if(m==0){ return ans; }
        int n = matrix[0].length;
        if(n==0){ return ans; }
        boolean[][] visit = new boolean[m][n];
        int dir[][]={{0,1},{1,0},{0,-1},{-1,0}};
        int t = 0;//走哪个方向,0右 1下 2左 3上
        int x = 0,y = 0;
        boolean end = false;
        while(!end)
        {
            ans.add(matrix[x][y]);
            visit[x][y] = true;
            for(int i = 0 ; i < 5 ; i++)//如果现在的位置四个方向都不能走了,循环就可以结束了。
            {
                if(i == 4){end = true;break;}
                int tx = x + dir[t][0];
                int ty = y + dir[t][1];
                if(tx >= 0 && tx < m && ty >= 0 && ty < n && !visit[tx][ty])
                {
                    x = tx;
                    y = ty;
                    break;
                }
                else{//失败了,换方向走
                    t = (t+1)%4;
                }
            }
        }
        return ans;
    }
}

python

class Solution:
    def spiralOrder(self , matrix ):
        ans = []
        m = len(matrix)
        if m==0:
            return ans
        n = len(matrix[0])
        if n==0:
            return ans
        visit = [[False for i in range(n)] for j in range(m)]
        dir =[[0,1],[1,0],[0,-1],[-1,0]]
        t = 0#走哪个方向,0右 1下 2左 3上
        x = 0
        y = 0
        end = False
        while end==False:
            ans.append(matrix[x][y])
            visit[x][y] = True
            for i in range(0,5):#如果现在的位置四个方向都不能走了,循环就可以结束了。
                if i == 4:
                    end = True
                    break
                tx = x + dir[t][0]
                ty = y + dir[t][1]
                if tx >= 0 and tx < m and ty >= 0 and ty < n and visit[tx][ty]==False:
                    x = tx
                    y = ty
                    break
                else:#失败了,换方向走
                    t = (t+1)%4;
        return ans