Question:
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]
.
Solution:
class Solution {
public:
vector<int> result;
vector<int> spiralOrder(vector<vector<int> > &matrix)
{
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
vector<int> result;
if(matrix.empty()) return result;
int xBeg=0, xEnd = matrix.size() - 1;
int yBeg=0, yEnd = matrix[0].size() - 1;
while(true)
{
for(int i = yBeg; i <= yEnd; i++)
{
result.push_back(matrix[xBeg][i]);
}
if(++xBeg > xEnd) break;
for(int i = xBeg; i <= xEnd; i++)
{
result.push_back(matrix[i][yEnd]);
}
if(--yEnd < yBeg) break;
for(int i = yEnd; i >= yBeg; i--)
{
result.push_back(matrix[xEnd][i]);
}
if(--xEnd < xBeg) break;
for(int i = xEnd; i >= xBeg; i--)
{
result.push_back(matrix[i][yBeg]);
}
if(++yBeg > yEnd) break;
}
return result;
}
};
另外自己又用递推实现了一下,VC 6.0完美运行,但是LeetCode总是提示对于case[[2,3]]有误,不明原因,但是在VC上答案正确,久思不得其解,不知有人知道原因否? 代码如下:
#include <iostream>
#include <vector>
using namespace std;
vector<int> result;
vector<int> spiralOrder(vector<vector<int> > &matrix)
{
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
vector<int>::size_type len = matrix.size();
if(len == 0) return result;
vector<int>::size_type w = matrix[0].size();
if(w == 0) return result;
vector<int> first = *(matrix.begin());
vector<int> last = *(matrix.end() - 1);
for (vector<int>::iterator it = first.begin(); it != first.end(); it++)
{
result.push_back(*it);
}
if(len > 1)
{
for (vector<vector<int> >::iterator it1 = matrix.begin() + 1; it1 != matrix.end() - 1; it1++)
{
result.push_back(*((*it1).end()-1));
}
if(last.size() >= 1)
{
for (vector<int>::iterator it2 = last.end() - 1; it2 != last.begin(); it2--)
{
result.push_back(*it2);
}
}
for (vector<vector<int> >::iterator it3 = matrix.end() - 1; it3 != matrix.begin(); it3--)
{
result.push_back(*((*it3).begin()));
}
}
matrix.erase(matrix.begin());
if(matrix.size() >= 1 )
{
matrix.erase(matrix.end() - 1);
if(matrix.size() >= 1)
{
for (vector<vector<int> >::iterator it4 = matrix.begin(); it4 != matrix.end(); it4++)
{
if((*it4).size() >= 1){
(*it4).erase((*it4).begin());}
if((*it4).size() >= 1){
(*it4).erase((*it4).end() - 1);}
}
}
}
spiralOrder(matrix);
return result;
}
int main()
{
vector<vector<int> > matrix;
vector<int> tem1, tem2, tem3,tem4;
tem1.push_back(1); tem1.push_back(2); tem1.push_back(3);
tem2.push_back(4); tem2.push_back(5); tem2.push_back(6);
tem3.push_back(7); tem3.push_back(8); tem3.push_back(9);
tem4.push_back(10); tem4.push_back(11); tem4.push_back(12);
matrix.push_back(tem1); matrix.push_back(tem2); matrix.push_back(tem3);matrix.push_back(tem4);
vector<int> res = spiralOrder(matrix);
for (vector<int>:: iterator it = res.begin(); it != res.end(); it++)
{
cout << *it << " ";
}
cout << endl;
return 0;
}