Encontrar el mínimo número k de la matriz.
- Ordena, $ n log (n) $
- Mantener el tamaño de la más grande montón de k, $ n log (k) $
- drenaje rápido pensado que el tiempo deseable complejidad $ O (n) $, el peor caso el tiempo la complejidad $ O (n ^ 2) $, partición aleatoria mejora el peor de los casos
clase Solution { público : int partición (vector < int > & nums, int l, int r) { int pivote = nums [r]; int i = l - 1 ; para ( int j = l; j <r; ++ j) { si (nums [j] < pivote) { i ++ ; de intercambio (nums [i], nums [j]); } } De swap (nums [i + 1 ], nums [r]); volver i +1 ; } Int randomized_partition (vector < int > & nums, int l, int r) { int i = rand ()% (r - l + 1 ) + l; de intercambio (nums [i], nums [r]); retorno de partición (nums, L, R); } Void randomized_selected (vector < int > & nums, int l, int r, int k) { si (l> = r) de retorno ; int pos = randomized_partition (nums, L, R); int num = pos - l +1 ; si (k == num) de retorno ; más si (k <num) randomized_selected (nums, l, pos - 1 , k); más randomized_selected (nums, pos + 1 , r, k - num); } Vector < int > getLeastNumbers (vector < int > & arr, int k) { srand ((sin signo) tiempo (NULL)); randomized_selected (arr, 0 , ( int ) arr.size () - 1 , k); vector < int > res (arr.begin (), arr.begin () +k); volver res; } };