Wednesday, October 23, 2013

54. Spiral Matrix -M

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
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 第一个不取,但是取最后一个。







这里的关键点是 layer的时候,(因为一开始写成了i,因此导致错误, layer是需要min(col,row)

No comments:

Post a Comment