Pregunta: ¿Encuentra el número k-ésimo más grande en una matriz?
Esta pregunta es realmente lo suficientemente buena, pero para escribir bellamente, realmente necesitas mirar bien.
1. Ordenar!
Ordene primero, luego encuentre el número k-ésimo más grande de acuerdo con el índice
Complejidad temporal: O(log(n)*n), complejidad espacial O(1)
Cualquiera que haya estudiado java puede pensar en ello, pero el entrevistador te preguntará, ¿hay alguna otra forma?
import java. util. Arrays ;
class Main {
public static void main ( String [ ] args) {
int [ ] nums = new int [ ] {
9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
int k= 9 ;
Arrays . sort ( nums) ;
System . out. println ( nums[ nums. length- 1 ] ) ;
}
}
2. Pequeña pila de raíces
De acuerdo con el almacenamiento de un pequeño montón raíz que contiene k elementos, la parte superior del montón es el késimo más pequeño, y se han eliminado los más pequeños que el késimo.
Complejidad temporal: O(lg(n)*n), complejidad espacial O(n)
Cuando escriba esto, el entrevistador estará más satisfecho y puede preguntarle en qué estructura de datos se basa PriorityQueue: la respuesta es binaria.
import java. util. PriorityQueue ;
class Main {
static PriorityQueue < Integer > que = new PriorityQueue < > ( ) ;
public static void main ( String [ ] args) {
int [ ] nums = new int [ ] {
9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
int k= 9 ;
for ( int i: nums) {
add ( i, k) ;
}
System . out. println ( que. peek ( ) ) ;
}
static void add ( int x, int k) {
que. add ( x) ;
if ( que. size ( ) > k) {
que. poll ( ) ;
}
}
}
3. Búsqueda binaria
Basado en la idea de clasificación rápida (puede ubicar el subíndice de un elemento después de clasificar) + búsqueda binaria
Complejidad temporal: O(logz^(n)*n), complejidad espacial O(1)
¡Tienes que escribir aquí, el entrevistador quedará muy satisfecho! ! !
class Main {
public static void main ( String [ ] args) {
int [ ] nums = new int [ ] {
9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
int k= 9 ;
int l= 0 ;
int r= nums. length- 1 ;
while ( l<= r) {
int m= partition ( l, r, nums) ;
if ( m == nums. length- k) {
System . out. println ( nums[ m] ) ;
break ;
} else if ( m > nums. length- k) {
r= m- 1 ;
} else {
l= m+ 1 ;
}
}
}
public static int partition ( int l, int r, int nums[ ] ) {
int flag= l;
int index= l+ 1 ;
for ( int i= index; i<= r; i++ ) {
if ( nums[ i] < nums[ flag] ) {
int temp= nums[ index] ;
nums[ index] = nums[ i] ;
nums[ i] = temp;
index++ ;
}
}
int temp= nums[ index- 1 ] ;
nums[ index- 1 ] = nums[ flag] ;
nums[ flag] = temp;
return index- 1 ;
}
}