基于快排的top k
class Solution
{
public :
void qsort ( vector< int > & v, int start, int end, vector< int > & ret, int k) {
int picked = rand ( ) % ( end - start + 1 ) + start;
swap ( v[ picked] , v[ start] ) ;
int pivot = v[ start] ;
int index = start;
for ( int i = start + 1 ; i <= end; i++ ) {
if ( v[ i] >= pivot) {
swap ( v[ index + 1 ] , v[ i] ) ;
index++ ;
}
}
swap ( v[ start] , v[ index] ) ;
if ( k <= index - start) {
qsort ( v, start, index - 1 , ret, k) ;
}
else {
for ( int i = start; i <= index; i++ ) {
ret. push_back ( v[ i] ) ;
}
if ( k > index - start + 1 ) {
qsort ( v, index + 1 , end, ret, k - ( index - start + 1 ) ) ;
}
}
}
vector< int > topKFrequent ( vector< int > & nums, int k) {
vector< int > ret;
qsort ( nums, 0 , nums. size ( ) - 1 , ret, k) ;
return ret;
}
} ;
基于堆的top k
class Solution
{
public :
void TopK_Heap ( vector< int > & arr, int k)
{
if ( arr. size ( ) <= k)
return ;
vector< int > box;
box. resize ( k) ;
for ( int i = 0 ; i < k; i++ )
box[ i] = arr[ i] ;
for ( int i = box. size ( ) / 2 ; i >= 0 ; i-- )
HeapAdjust ( box, i) ;
for ( int i = k; i < arr. size ( ) ; i++ )
{
if ( arr[ i] > box[ 0 ] )
{
box[ 0 ] = arr[ i] ;
HeapAdjust ( box, 0 ) ;
}
}
for ( int i = 0 ; i < box. size ( ) ; i++ )
cout << box[ i] << endl;
}
private :
void HeapAdjust ( vector< int > & nums, int pos)
{
for ( int i = 2 * pos + 1 ; i < nums. size ( ) ; i = 2 * i + 1 )
{
if ( i< nums. size ( ) - 1 && nums[ i] > nums[ i + 1 ] )
i++ ;
if ( nums[ i] >= nums[ pos] )
break ;
swap ( nums[ i] , nums[ pos] ) ;
pos = i;
}
}
} ;