-
Notifications
You must be signed in to change notification settings - Fork 0
Semana 13 Monticulos Intervalos y Greedy
Resolver problemas de prioridad, rangos y decisiones locales justificadas usando montículos, ordenamiento y conteo de frecuencias.
| Problema | Patrón | Función | Tests |
|---|---|---|---|
| Kth Largest Element in an Array | Montículo mínimo acotado | kth_largest |
3 |
| Find Median from Data Stream | Dos montículos | MedianFinder |
3 |
| Merge Intervals | Ordenar y fusionar | merge_intervals |
2 |
| Insert Interval | Insertar y fusionar | insert_interval |
2 |
| Meeting Rooms | Ordenar por inicio | can_attend_meetings |
2 |
| Meeting Rooms II | Montículo mínimo de finales | min_meeting_rooms |
2 |
| Non-overlapping Intervals | Greedy por fin más temprano | erase_overlap_intervals |
2 |
| Task Scheduler | Greedy por frecuencia máxima | task_scheduler |
4 |
| Merge K Sorted Lists | Montículo mínimo por cabeza | merge_k_sorted_lists |
2 |
| K Closest Points to Origin | Montículo máximo acotado | k_closest_points_heap |
2 |
| Last Stone Weight | Simulación con max heap | last_stone_weight |
2 |
| Minimum Number of Arrows to Burst Balloons | Greedy por fin más temprano | min_arrows_to_burst_balloons |
2 |
| Jump Game II | Greedy por frontera | jump_game_ii |
2 |
| Gas Station | Greedy con reinicio | can_complete_circuit |
2 |
Se usa cuando solo importan los k mejores valores.
Invariante:
- El montículo nunca guarda más de
kelementos. - La raíz representa el menor valor entre los
kmejores vistos.
En k_closest_points_heap, el heap conserva los k puntos con menor distancia cuadrada.
En merge_k_sorted_lists, el heap guarda la cabeza actual de cada lista.
Invariante:
- Cada extracción produce el siguiente valor globalmente menor.
- Después de consumir una cabeza, se inserta el siguiente nodo de esa misma lista.
- El heap contiene como máximo un nodo por lista activa.
Para medianas en streaming:
-
lowerguarda la mitad menor como max heap. -
upperguarda la mitad mayor como min heap usandoReverse. -
lowerpuede tener como máximo un elemento más queupper.
En last_stone_weight, siempre se necesitan las dos piedras más pesadas.
Invariante:
- Si las piedras pesan igual, ambas desaparecen.
- Si son distintas, solo vuelve al heap la diferencia.
- El heap siempre representa las piedras restantes.
Se ordena por inicio y se compara cada intervalo con el último rango fusionado.
Invariante:
- El vector de respuesta siempre contiene intervalos no solapados.
Para contar salas, un montículo mínimo guarda los finales activos.
Invariante:
- Antes de abrir una sala nueva, se liberan todas las salas cuyo final es menor o igual al inicio actual.
En intervalos no solapados, conviene conservar el intervalo que termina antes porque deja más espacio para los siguientes.
La misma idea aparece en min_arrows_to_burst_balloons: disparar al final más temprano cubre todos los globos que se solapan con ese punto.
En Task Scheduler, la tarea más frecuente define la estructura mínima de bloques:
(max_count - 1) * (cooldown + 1) + number_of_max_tasks
El resultado real es el máximo entre ese marco mínimo y el número total de tareas.
En jump_game_ii, cada salto cubre una ventana de índices alcanzables.
Invariante:
-
current_endmarca hasta dónde llega el número actual de saltos. -
farthestacumula el mejor alcance del siguiente salto. - Si la frontera no avanza, el final es inalcanzable.
En can_complete_circuit, si el tanque cae por debajo de cero, ningún punto dentro del segmento actual puede ser inicio válido.
Invariante:
- El balance total decide si existe solución.
- Cada reinicio descarta un prefijo imposible.
Montículo máximo:
BinaryHeap<i32>Montículo mínimo:
BinaryHeap<Reverse<i32>>Intervalos:
Vec<(i32, i32)>- Usar sort completo para kth largest cuando un montículo acotado reduce memoria.
- No rebalancear los dos montículos después de insertar en median stream.
- No limitar el heap a
kelementos cuando solo importan los mejores. - Fusionar intervalos sin ordenarlos primero.
- Considerar solapados intervalos donde
end == start. - En Task Scheduler, olvidar que varias tareas pueden compartir la frecuencia máxima.
- En Jump Game II, contar saltos por índice en vez de por frontera.
- En Gas Station, elegir el mínimo local sin validar el balance total.
cargo testResultado al cerrar el bloque:
411 passed; 0 failed
El siguiente bloque recomendado es:
- Consultas por rangos.
- Estructuras persistentes simples.
- Ventanas monotónicas.
Primeros problemas sugeridos:
- Range Sum Query 2D Immutable.
- Range Addition.
- Sliding Window Maximum.
- Queue Reconstruction by Height.