Algoritmo: búsqueda binaria
Complejidad: O (N1 * (log (N2) + log (N3))).
Para el algoritmo O (n1 + n2 + n3): encuentre elementos comunes en tres matrices ordenadas – GeeksforGeeks
La idea es atravesar la primera matriz y encontrar si está presente tanto en la segunda como en la tercera.
Si está allí en ambas matrices, agréguelo a la lista y, para los valores siguientes, busque binariamente los valores próximos con índices iniciales de arr2 y arr3 como los índices de búsqueda anteriores +1 y el índice final igual
- ¿Cómo puede un ingeniero de ECE aclarar la ronda de entrevistas técnicas?
- Cómo prepararme para una entrevista de programación cuando tengo 7-8 meses
- ¿Qué soluciones existen para el mayor problema de submatriz ordenada?
- ¿Las grandes compañías como Google, Microsoft o Apple contratan programadores principiantes de más de 30 años?
- WordPress: ¿Cuáles serían algunas preguntas de entrevista comunes que se le hacen a un desarrollador experimentado de WordPress?
En la primera iteración: x = Búsqueda binaria (array2, int i, int size);
y = Binarysearch (array3, int j, int size);
En la siguiente iteración, actualice como i = x + 1; y j = y + 1; y continúa la búsqueda
La idea es que las matrices están ordenadas y no encontraremos los siguientes elementos en la región 0-x y 0-y.
PD: este código se vuelve eficiente cuando los tamaños de entrada son muy grandes
#include
usando el espacio de nombres estándar;
int bsearch (int arr [], int key, int l, int r)
{
int mid;
mientras que (l <= r)
{
mid = l + (rl) / 2;
if (arr [mid] == key) return mid;
if (arr [mid] <tecla) l = mid + 1;
sino r = mid-1;
}
si (l <= r) devuelve l;
de lo contrario, devuelve -1;
}
int min (int a, int b)
{
si (a <= b) devuelve a;
de lo contrario, devuelve b;
}
int main ()
{
int n1, n2, n3;
scanf (“% d% d% d”, & n1, & n2, & n3);
int i, j, k, l, m;
l = min (min (n1, n2), n3);
int arr1 [10], arr2 [10], arr3 [10], cmn [10];
para (i = 0; i <n1; i ++) scanf ("% d", & arr1 [i]);
para (i = 0; i <n2; i ++) scanf ("% d", & arr2 [i]);
para (i = 0; i <n3; i ++) scanf ("% d", & arr3 [i]);
m = 0;
int st1 = 0, st2 = 0, dep, tep;
para (i = 0; i <n1; i ++)
{
j = bsearch (arr2, arr1 [i], st1, n2-1);
k = bsearch (arr3, arr1 [i], st2, n3-1);
si (j! = – 1 && k! = – 1)
{
cmn [m ++] = arr1 [i];
dep = arr2 [j];
tep = arr3 [k];
while (j> 0 && arr2 [j] == dep) j–;
while (k> 0 && arr3 [k] == tep) k–;
if (arr2 [j]! = dep) j ++;
if (arr3 [k]! = tep) k ++;
arr2 [j] = – 100000;
arr3 [k] = – 100000;
st1 = j + 1;
// valores clave actualizados de las búsquedas para la próxima iteración.
st2 = k + 1;
}
}
para (i = 0; i <m; i ++)
{
printf (“% d”, cmn [i]);
}
printf (“\ n”);
}
Entrada:
3 5 4
1 5 5
3 4 5 5 10
5 5 10 20
Salida: 5 5
Buena Suerte 🙂