Example 1:
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] Output: [1,2,3,4,8,12,11,10,9,5,6,7]
A:
一层层地剥开罢, 按照上->右->下->左的顺序加入即可。注意,当只有一行,一列的情况。(某一行,或某一列尽量取多的值。 同时, 在检查下面行,左边列的时候,要检查是否本行/列 已经加过。
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> res; int m = matrix.size(); if(m==0) return res; int n=matrix[0].size(); for(int lay =0; lay<(min(n,m)+1)/2;++lay) // lay is layer { for(int col = lay; col< n-lay; ++col) // first row, get all value res.push_back(matrix[lay][col]); for(int row=lay+1; row <m-lay;++row) //right column, Not first one, but last one res.push_back(matrix[row][n-1-lay]); if(lay<m-1-lay) for(int col = n-2-lay; col>lay; --col) res.push_back(matrix[m-1-lay][col]); if(lay<n-1-lay) for(int row = m-1-lay;row>lay;--row) res.push_back(matrix[row][lay]); } return res; } };
Mistakes:
1: 由于我们每个边都是取了开头,没有取最后一个。 导致,当只有一个点的时候,我们没能取出来。
解决方法: 把upper row,全部取出来。
2; 当只有一行的时候, 我们取了两遍, 而这里,我们应该是先比较行数和列数,是否相同的。
3: 当只有一列的时候, 类似于第一个错误,我们应该在某一列, 尽量取多的值。
i. e. right col 第一个不取,但是取最后一个。
No comments:
Post a Comment