Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,
Given the following matrix:

[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].

本题要求按照螺旋方式读取矩阵,并输出到一个向量中。题意很简单,关键就是如何去做。

我是参考网上的一个教程,然后想了一下,自己写出了答案,这个做法很漂亮,很值得借鉴,直接上代码吧!需要注意的地方就是控制循环的出口。

代码如下:

import java.util.ArrayList;
import java.util.List;

/*
 * 这些做法很漂亮,分别控制4个边界指针,然后读取元素
 * 
 * */
public class Solution 
{
    public List<Integer> spiralOrder(int[][] matrix)
    {
        List<Integer> res=new ArrayList<Integer>();
        if(matrix==null || matrix.length<=0)
            return res;

        int left=0,right=matrix[0].length-1;
        int top=0,bottom=matrix.length-1;
        while(true)
        {
            //从左到右
            for(int i=left;i<=right;i++)
                res.add(matrix[top][i]);
            top++;
            if(top>bottom)
                break;

            //从上到下
            for(int i=top;i<=bottom;i++)
                res.add(matrix[i][right]);
            right--;
            if(left>right)
                break;

            //从右到左
            for(int i=right;i>=left;i--)
                res.add(matrix[bottom][i]);
            bottom--;
            if(top>bottom)
                break;

            //从下到上
            for(int i=bottom;i>=top;i--)
                res.add(matrix[i][left]);
            left++;
            if(left>right)
                break;
        }
        return res;

    }
}

下面是C++的做法,很棒的做法

代码如下:

#include <iostream>
#include <vector>

using namespace std;

class Solution 
{
public:
    vector<int> spiralOrder(vector<vector<int>>& mat) 
    {
        vector<int> res;
        if (mat.size() <= 0)
            return res;

        int left = 0, right = mat[0].size()-1;
        int up = 0, down = mat.size()-1;
        while (true)
        {
            for (int i = left; i <= right; i++)
                res.push_back(mat[up][i]);
            up++;
            if (up > down)
                break;

            for (int i = up; i <= down;i++)
                res.push_back(mat[i][right]);
            right--;
            if (left > right)
                break;

            for (int i = right; i >= left;i--)
                res.push_back(mat[down][i]);
            down--;
            if (up > down)
                break;

            for (int i = down; i >= up; i--)
                res.push_back(mat[i][left]);
            left++;
            if (left > right)
                break;
        }
        return res;
    }
};