class Solution {
public :
int kthSmallest ( vector< vector< int >> & matrix, int k) {
int n= matrix. size ( ) ;
priority_queue< int , vector< int > , greater< int >> q;
for ( int i= 0 ; i< n; i++ ) {
for ( int j= 0 ; j< n; j++ ) {
q. push ( matrix[ i] [ j] ) ;
}
}
for ( int j= 0 ; j< k- 1 ; j++ ) {
q. pop ( ) ;
}
return q. top ( ) ;
}
} ;
class Solution {
public:
int kthSmallest ( vector< vector< int >> & matrix, int k) {
int n= matrix. size ( ) ;
struct point {
int val, x, y;
point ( int val, int x, int y) {
this- > val= val;
this- > x= x;
this- > y= y;
}
bool operator > ( const point & a) const {
return this- > val> a. val;
}
} ;
priority_queue< point, vector< point> , greater< point>> q;
for ( int i= 0 ; i< n; i++ ) {
q. push ( point ( matrix[ i] [ 0 ] , i, 0 ) ) ;
}
for ( int i= 0 ; i< k- 1 ; i++ ) {
point top= q. top ( ) ;
q. pop ( ) ;
if ( top. y< n- 1 ) {
q. push ( point ( matrix[ top. x] [ top. y+ 1 ] , top. x, top. y+ 1 ) ) ;
}
}
return q. top ( ) . val;
}
} ;
class Solution {
public :
int numOfLeMid ( vector< vector< int >> & matrix, int mid) {
int n= matrix. size ( ) ;
int i= n- 1 , j= 0 ;
int sum= 0 ;
while ( i>= 0 && j< n) {
if ( matrix[ i] [ j] <= mid) {
sum+ = i+ 1 ;
j++ ;
}
else
i-- ;
}
return sum;
}
int kthSmallest ( vector< vector< int >> & matrix, int k) {
int L= matrix[ 0 ] [ 0 ] ;
int n= matrix. size ( ) ;
int R= matrix[ n- 1 ] [ n- 1 ] ;
while ( L< R) {
int mid= L+ ( ( R- L) >> 2 ) ;
if ( numOfLeMid ( matrix, mid) < k)
L= mid+ 1 ;
else
R= mid;
}
return L;
}
} ;
class Solution {
public:
int kthSmallest ( vector< vector< int >> & matrix, int k) {
int n= matrix. size ( ) ;
priority_queue< int , vector< int > , less< int >> q;
for ( int i= 0 ; i< n; i++ ) {
for ( int j= 0 ; j< n; j++ ) {
if ( q. size ( ) == k) {
if ( matrix[ i] [ j] > q. top ( ) ) continue ;
else
q. pop ( ) ;
}
q. push ( matrix[ i] [ j] ) ;
}
}
return q. top ( ) ;
}
} ;