我觉得这个题好无聊啊,好端端一个数组,干嘛要跟比巴卜一样转一圈输出呢。。
思想很简单,每次从左到右,再从上到下,在从右到左,再从下到上。问题是每次到什么时候该改变方向。我的做法是用一个变量保存当前在第几层,这个层是相对于从外向内有几圈来说的。注意想清楚边界的话这个题一点也不难。有个细节,我的循环退出条件是访问的数跟矩阵总个数之间的关系,如果有一次在判断进入循环是条件是满足的,但是在循环内部不满足了,我的策略是忽略这种情况,虽然这样会在结果集中多加一些重复的数据,但是以我的算法,一定是先访问没有访问过的数据,再访问重复数据的,因此可以回退回去,避免了考虑每次在循环里都考虑有没有到达越界的情况。
class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { int msize = matrix.size(); vector<int> res; if(msize == 0) return res; if(msize == 1) return matrix[0]; int cur = 0, row = msize, column = matrix[0].size(), i=0, j=0, level = 0; while(cur<row*column){ while(j<column-level) {res.push_back(matrix[i][j++]); ++cur;} --j;++i; while(i<row-level) {res.push_back(matrix[i++][j]); ++cur;} --j;--i; while(j>=level) {res.push_back(matrix[i][j--]); ++cur;} ++j;--i; while(i>level) {res.push_back(matrix[i--][j]); ++cur;} ++j;++i; ++level; } while(cur>row*column){ res.pop_back(); cur--; } return res; } };
leetcode第一刷_Spiral Matrix,布布扣,bubuko.com
原文:http://blog.csdn.net/u012792219/article/details/25657307