¿Cómo encuentro el rango mínimo que contiene un número de cada matriz ordenada?

Puedes hacerlo mucho mejor que la fuerza bruta. Creo que se puede resolver en [math] O (n \ log {k}) [/ math] donde n es el número de todos los elementos en los arrays yk es el número de arrays.

Esta es mi solución:

Deje que M sea un montón mínimo de mínimos en cada una de estas matrices.
ARRAYS = [
[1 1000 2000]
[20 1001 5000]
[55 1002 222222]
]

M = [1, 20, 55]

No hay rango que comience con min (M) y sea más corto que (min (M), max (M)). Por ejemplo, (1,55) es el rango más corto que comienza con 1. Es decir, cualquier otro rango que comience con 1 tendrá la misma longitud o tendrá un elemento mayor que 55.

Hasta ahora, el min_range es (1,55).

Ahora eliminemos 1:
ARRAYS = [
[1000 2000]
[20 1001 5000]
[55 1002 222222]
]

M = [20 55 1000], min (M) = 20, max (M) = 1000. Entonces, el rango mínimo a partir de 20 es (20, 1000).

min_range sigue siendo (1,55).

Ahora eliminemos 20:
ARRAYS = [
[1000 2000]
[1001 5000]
[55 1002 222222]
]
M = [55 1000 1001], min (M) = 50, max (M) = 1001. Entonces, el rango mínimo a partir de 55 es (55, 1001). ¡Ningún cambio en min_range!

Ahora eliminemos 55:
ARRAYS = [
[1000 2000]
[1001 5000]
[1002 222222]
]
M = [1000 1001 1002], min (M) = 1000, max (M) = 1002. Entonces, el rango mínimo a partir de 1000 es (1000, 1002).

Ahora tenemos un nuevo min_range: (1000,1002).

Continuamos esto hasta que una de las listas se vacía, y luego tenemos el min_range.

Esta es mi implementación de c ++ 11 de esto (que en lugar de eliminar elementos almacena un índice de barrido para cada vector):

#include  #include  #include  #include  #include  #include  using std::get; using std::numeric_limits; using std::pair; using std::priority_queue; using std::vector; pair find_min_range(const vector<vector>& arrays) { // The result. pair min_range{ numeric_limits::min(), numeric_limits::max() }; // Sweeping index on each row. vector indices(arrays.size()); // M. std::priority_queue<pair, std::vector<pair>, std::greater<pair>> minimums; // max(M). auto max = arrays[0][0]; for (auto i = 0; i < arrays.size(); i++) { auto v = arrays[i][0]; minimums.push({v, i}); if (max  long(max) - long(min_val)) { min_range = {min_val, max}; } indices[min_row]++; if (indices[min_row] == arrays[min_row].size()) { return min_range; } auto v = arrays[min_row][indices[min_row]]; if (max < v) { max = v; } minimums.push({v, min_row}); } return min_range; } int main() { vector<vector> a { {1, 1000, 2000}, {20, 1001, 5000}, {55, 1002, 222222} }; auto res = find_min_range(a); printf("Minimum range is (%d, %d)\n", res.first, res.second); return 0; } 

Combine las matrices y uniquifique los valores, y luego ejecute una ventana deslizante sobre los valores ordenados. Para encontrar la ventana deslizante mínima, mantenga dos punteros, incrementando el derecho si el rango es demasiado pequeño e incrementando el izquierdo una vez que el rango sea demasiado grande. Esta es una técnica estándar para encontrar rangos mínimos / máximos en tiempo lineal siempre que el objetivo sea monótono.

Para este problema en particular, también necesita mantener una estructura de datos que le permita detectar si tiene un número de cada fila. Esto se puede hacer con una matriz que cuenta la frecuencia de cada fila, más un contador que mantiene el número de filas únicas. Si una frecuencia se incrementa a uno, incremente el contador, y si una frecuencia se reduce a cero, disminuya el contador.

El tiempo de ejecución es [matemática] O (n \ log k) [/ matemática], donde n es el número de entradas yk es el número de matrices, desde el paso de fusión inicial. Para fusionar múltiples matrices ordenadas rápidamente, mantenga un montón de tamaño k que contenga el elemento superior de cada matriz.

Podemos resolver este problema utilizando la estructura de datos de Heap (Min Heap).

Podemos crear Min Heap usando los primeros elementos de toda la lista ordenada.

Se extraerá uno por uno el elemento Min y cada vez que verifiquemos el rango mínimo calcularemos la diferencia entre el elemento mínimo y máximo presente en el montón en ese momento.

Ejemplo:

Lista 1 = {4,10,15,24,26}

Lista 2 = {0,9,12,20}

Lista 3 = {5,18,22,30}

Lista 4 = {23,33,42,43}

primer montón mínimo: 0,4,5,23

ahora el rango es de 0 a 23

podemos exprimir este rango reemplazando el elemento Min por el siguiente elemento de la misma lista.

Reemplace 0 con 9

Segundo montón mínimo: 4,5,9,23

ahora el rango es de 4 a 23

Reemplace 4 con 10

Third Min Heap: 5,9,10,23

ahora el rango es de 5 a 23

.

.

.

.

continuar hasta que una de las listas no esté terminada.

Para fines de implementación, he usado Priority Queue (como Min-Heap).

Encuentra el siguiente código para el mismo.

——————————————————————————————————-

import java.util.ArrayList;

import java.util.List;

import java.util.PriorityQueue;

import java.util.SortedSet;

import java.util.TreeSet;

public class MinimumRangeKsortedList {

public static void main (String [] args) {

List > lists = new ArrayList > ();

List list1 = new ArrayList (); // 4,10,15,24,26

list1.add (4);

list1.add (10);

list1.add (15);

list1.add (24);

list1.add (26);

List list2 = new ArrayList (); // 0,9,12,20

list2.add (0);

list2.add (9);

list2.add (12);

list2.add (20);

List list3 = new ArrayList (); // 5,18,22,30

list3.add (5);

list3.add (18);

list3.add (22);

list3.add (30);

List list4 = new ArrayList (); // 23,33,42,43

list4.add (23);

list4.add (33);

list4.add (41);

list4.add (43);

lists.add (list1);

lists.add (list2);

lists.add (list3);

lists.add (list4);

MinimumRangeKsortedList.findMinRange (listas);

}

private static void findMinRange (List > lists) {

PriorityQueue queue = new PriorityQueue ();

SortedSet entradas = nuevo TreeSet ();

para (int i = 0; i

{

entradas.add (nuevo paquete (lists.get (i) .get (0), i));

queue.add (nuevo paquete (lists.get (i) .remove (0), i));

}

Resultado res = nuevo Resultado ();

res.min = Entradas.first (). datos;

res.max = entries.last (). data;

while (verdadero) {

Paquete minData = queue.remove ();

entradas.remove (minData);

if (lists.get (minData.listID) .size ()> 0)

{

Entradas.add (nuevo paquete (lists.get (minData.listID) .get (0), minData.listID));

queue.add (nuevo paquete (lists.get (minData.listID) .remove (0), minData.listID));

int primero = entradas.first (). datos;

int last = entries.last (). data;

if ((last-first) <(res.max-res.min) && queue.size () == lists.size () && entries.size () == lists.size ())

{

res.min = primero;

res.max = last;

}

}

más

{

System.out.println (res.min + “,” + res.max);

rotura;

}

}

}

}

Resultado de clase

{

int max;

int min;

}

El paquete de clase implementa comparable

{

public final int listID;

datos int finales públicos;

Paquete público (int data, int listID)

{

this.listID = listID;

this.data = datos;

}

@Anular

public int compareTo (paquete de paquetes) {

// TODO Código auxiliar de método generado automáticamente

datos de retorno – paquete.datos;

}

}

Mis pensamientos están alineados con la respuesta de Soheil Hassas Yeganeh. He compilado un artículo sobre un problema similar hace mucho tiempo – Ordenar números almacenados en diferentes máquinas – GeeksforGeeks

Tomaría una matriz de punteros de tamaño k donde k es el número de filas en la entrada, cada una apuntando a un elemento de la fila de entrada inicialmente. En cualquier momento, tenemos una ventana / rango de tamaño k (un elemento de cada fila) y el rango es [min … .max]. Encontramos el elemento min del rango y lo reemplazamos con el siguiente elemento del mismo. Actualice el rango [min … max] si (max-min) es menor que el valor anterior. Continúe esto hasta llegar al final de una de las filas.

[1 1000 2000]
[20 1001 5000]
[55 1002 222222]

[1, 20, 55] -> [min… max -> [1… 55]

Reemplazar 1 con 1000

[1000, 20, 55] -> [min … max -> [20 … 1000]

Reemplace 20 con 1001

[1000, 1001, 55] -> [min … max -> [55 … 1001]

Reemplazar 55 con 1002

[1000, 1001, 1002] -> [min … max -> [1000 … 1002]

Reemplazar 1000 con 2000

[2000, 1001, 1002] -> [min … max -> [1001 … 2000]

Entonces, el rango mínimo resulta ser [1000, 1002]

Si te gusta esto, sigue mi blog Crack entrevistas técnicas

El enfoque más directo parece ser marcar una línea numérica (esencialmente un orden de conteo) con los números de fila donde se pueden encontrar los valores, luego barrer la línea para el rango mínimo, probablemente observando el último índice que hemos visto. de las filas representadas.

Para sus datos, en otras palabras, crea algo como esto:

1 – 1
20 – 2
55 – 3
1000 – 1
1001 – 2
1002 – 3
2000 – 1
5000 – 2
222222 – 3

Iterando a través de esta lista, básicamente reemplazamos los índices y verificamos el rango.
1: /
20: /
55: 55 – 1 = 54
1000: 1000-20 = 980
1001: 1001 – 55 = 946
1002: 1002 – 1000 = 2
2000: 2000-1001 = 999
5000: 5000 – 1002 – 3998
222222: 222222 – 2000 = 220222

Sin embargo, esto no depende de ningún tipo de orden, por lo que puede haber una forma más inteligente de lograr el objetivo. Pero siempre que no incluya todos los números posibles , en lugar de solo los números que tiene, es tiempo lineal (dos pasos a través del conjunto de datos). Cualquier cosa más eficiente necesitará saber que hay datos que omitir.

Supongo que si sabe que cada fila está ordenada, puede omitir la tabla de índice inicial e intentar recorrer cada fila simultáneamente, pero eso suena propenso a errores para un número arbitrario de filas.

verifique la solución aquí – Google Interview Question Ingeniero de software / Desarrolladores parece correcto

More Interesting

¿Qué debo esperar en la entrevista técnica para .NET en Skype de Microsoft Redmond?

¿Existe alguna otra forma de mejorar mis habilidades de programación contribuyendo a mi propia fuerza en un proyecto de código abierto?

¿Qué tipo de preguntas se hacen en la prueba de análisis Flipkart?

¿Cuál es la explicación y la prueba de la codiciosa solución en esta pregunta?

¿Cuáles son algunos ejemplos de configuraciones de problemas de entrevistas técnicas que son buenas para evaluar candidatos de aprendizaje automático?

Cómo prepararse bien para la entrevista con el desarrollador de C ++

¿Cuáles son las preguntas técnicas que se hacen durante la entrevista en el sitio como desarrollador front-end?

¿Cómo encontraría eficientemente un número que se elimina de una matriz sin clasificar con los números 1, 2, 3 ... N?

Cómo prepararse para una entrevista técnica

Cómo pasar las entrevistas de codificación para una pasantía en Facebook, Google, Microsoft, etc.

¿Qué temas técnicos deberían enfocarse para prepararse para una buena entrevista de empresa de software?

¿Cuál fue la mejor experiencia de entrevista que has tenido?

Cómo calcular de manera óptima la carga máxima en cada paso de tiempo, dada una lista de procesos y cargas asociadas

Si ha sido rechazado de una escuela de codificación de élite y ha vuelto a aplicar y luego ha sido aceptado, ¿cuál es su historia?

¿Cómo se manejaría mejor una pregunta de entrevista de programación como: cómo puede transferir un archivo extremadamente grande a través de una red y cómo puede optimizar el proceso?