leetcode 54. Spiral Matrix 螺旋方式读取矩阵

来源:互联网 发布:大数据应用方向 编辑:程序博客网 时间:2024/06/05 02:26

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;    }};
原创粉丝点击