class Solution {
private :
static constexpr int directions[ 4 ] [ 2 ] = { { 0 , 1 } , { 1 , 0 } , { 0 , - 1 } , { - 1 , 0 } } ;
public :
vector< int > spiralOrder ( vector< vector< int >> & matrix) {
if ( matrix. size ( ) == 0 || matrix[ 0 ] . size ( ) == 0 ) {
return { } ;
}
int rows = matrix. size ( ) , columns = matrix[ 0 ] . size ( ) ;
vector< vector< bool >> visited ( rows, vector < bool > ( columns) ) ;
int total = rows * columns;
vector< int > order ( total) ;
int row = 0 , column = 0 ;
int directionIndex = 0 ;
for ( int i = 0 ; i < total; i++ ) {
order[ i] = matrix[ row] [ column] ;
visited[ row] [ column] = true ;
int nextRow = row + directions[ directionIndex] [ 0 ] , nextColumn = column + directions[ directionIndex] [ 1 ] ;
if ( nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[ nextRow] [ nextColumn] ) {
directionIndex = ( directionIndex + 1 ) % 4 ;
}
row += directions[ directionIndex] [ 0 ] ;
column += directions[ directionIndex] [ 1 ] ;
}
return order;
}
} ;
class Solution {
public :
void setZeroes ( vector< vector< int >> & matrix) {
int m = matrix. size ( ) ;
int n = matrix[ 0 ] . size ( ) ;
vector< int > row ( m) , col ( n) ;
for ( int i = 0 ; i < m; i++ ) {
for ( int j = 0 ; j < n; j++ ) {
if ( ! matrix[ i] [ j] ) {
row[ i] = col[ j] = true ;
}
}
}
for ( int i = 0 ; i < m; i++ ) {
for ( int j = 0 ; j < n; j++ ) {
if ( row[ i] || col[ j] ) {
matrix[ i] [ j] = 0 ;
}
}
}
}
} ;
class Solution {
public :
int kthSmallest ( vector< vector< int >> & matrix, int k) {
vector< int > rec;
for ( auto & row : matrix) {
for ( int it : row) {
rec. push_back ( it) ;
}
}
sort ( rec. begin ( ) , rec. end ( ) ) ;
return rec[ k - 1 ] ;
}
} ;