本题相较于螺旋矩阵II的不同之处是:螺旋矩阵II的矩阵是n行n列的方阵,而本题的矩阵并不一定是方阵。所以在遵循循环不变量原则遍历完矩阵后,还会有一行或者一列没有遍历。
1、行多列少(多一列没遍历)
2、行少列多(多一行没遍历)
对于多出来的一行或者一列,要在遍历完每一个整圈之后,单独处理。
class Solution {
public : vector< int > spiralOrder ( vector< vector< int >> & matrix) { int width = matrix[ 0 ] . size ( ) ; int height = matrix. size ( ) ; int times= min ( width/ 2 , height/ 2 ) ; vector< int > result; int startX; int startY; for ( int i= 0 ; i< times; i++ ) { startX= i; startY= i; for ( ; startY< width- i- 1 ; startY++ ) { result. push_back ( matrix[ startX] [ startY] ) ; } for ( ; startX< height- i- 1 ; startX++ ) { result. push_back ( matrix[ startX] [ startY] ) ; } for ( ; startY> i; startY-- ) { result. push_back ( matrix[ startX] [ startY] ) ; } for ( ; startX> i; startX-- ) { result. push_back ( matrix[ startX] [ startY] ) ; } } if ( width> height) { if ( height% 2 != 0 ) { startX = height/ 2 ; startY = height/ 2 ; for ( ; startY< width- height/ 2 ; startY++ ) { result. push_back ( matrix[ startX] [ startY] ) ; } } } else { if ( width% 2 != 0 ) { startX = width/ 2 ; startY = width/ 2 ; for ( ; startX< height- width/ 2 ; startX++ ) { result. push_back ( matrix[ startX] [ startY] ) ; } } } return result; }
} ;