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;
}
};