Dada una matriz arr [0 … n-1], ¿cómo calculo arr_low [0 … n-1] eficientemente st arr_low [i] = número de elementos menor o igual que arr [i] en arr [i + 1 … n-1]?

Básicamente, la solución radica en el uso inteligente de la búsqueda binaria.
Así que intentaré explicarlo a través de un ejemplo:

Supongamos que tiene una matriz de números [4,3,2,5,6,1] y desea encontrar el arr_low. Entonces, la solución de fuerza bruta es atravesar el conjunto completo una vez y contar el número de números en el conjunto que son mayores que el número dado. La complejidad temporal de esta solución es O (n ^ 2) .

Así que ahora queremos hacerlo mejor que n ^ 2. Como podemos ver, el valor arr_low del último número siempre será cero, por lo que es mejor comenzar en orden inverso.

Ahora, una cosa a notar es que cuando comenzamos en reversa, el valor arr_low de un número dado es arr_low del número más bajo mayor que el número dado en la matriz recorrida hasta ahora.

Teniendo esto en cuenta, atravesaremos y crearemos una matriz auxiliar que mantendrá los números recorridos hasta ahora en un orden ordenado junto con el valor arr_low. Llamemos a la matriz auxiliar como aux.

Ahora, al recorrer en orden inverso, colocaremos el elemento en el auxiliar en el orden ordenado (Hecho de la misma manera que en Ordenar por inserción). La inserción en aux llevará tiempo O (log n) . Ahora, para cada elemento, necesitamos encontrar el elemento más alto más bajo que el elemento dado en el auxiliar (que por cierto ahora está ordenado y se puede hacer en tiempo O (log n) ) y colocar el elemento junto con el nuevo valor arr_low en el aux.

Entonces, la complejidad del tiempo neto es O (n * (log n + log n)), es decir, O (2nlogn), es decir, O (nlogn). La complejidad del espacio es O (N).

Lazo 1
arr: 4, 3, 2, 5, 6, 1
puntero a 1 (último elemento)
aux:
resultado: 0

Debido a que ningún elemento puede ser menor que el último elemento, arr_low es cero para él.

Lazo 2
arr: 4, 3, 2, 5, 6, 1
aux: (1,0)
resultado: 1,0

Búsqueda binaria para un número menor que 6, así que obtenga cero

Lazo 3
arr: 4, 3, 2, 5, 6, 1
Aux: (1,0) (6,0)
resultado: 1,1,0

La búsqueda binaria para un número mayor que 5 obtenemos (6,0) por lo que es arr_low será 0 + 1 = 1

Lazo 4
arr: 4, 3, 2, 5, 6, 1
Aux: (1,0) (5,1) (6,0)
resultado: 1,1,1,0

Lazo 5
arr: 4, 3, 2, 5, 6, 1
Aux: (1,0) (2,2) (5,1) (6,0)
resultado: 2,1,1,1,0

Lazo 6
arr: 4, 3, 2, 5, 6, 1
Aux: (1,0) (2,2) (3,2) (5,1) (6,0)
resultado: 3,2,1,1,0,0

Entonces el resultado neto es [3,2,1,1,1,0].

Gracias por A2A. En mi opinión,

  • Comience a escanear la matriz desde Arr [n-1]
  • Cree un BST y, en cada nodo, almacene adicionalmente el número de elementos secundarios en su subárbol izquierdo
  • Inserte cada nuevo elemento en el BST (modificado)

Espacio = O (n), Tiempo = O (nlogn).

Un BST (Binary Search Tree) debería ayudar.
Cree un BST con la matriz dada y recorra hacia la izquierda para los elementos más pequeños y hacia la derecha para los elementos más grandes, suponiendo que arr_low [i] es la raíz.

More Interesting

¿Cuál es su enfoque para las entrevistas de codificación de crack en empresas de primer nivel sin ser bueno en la programación competitiva?

¿Importa la experiencia en la programación de entrevistas?

¿Google siempre hace preguntas de matemáticas en las entrevistas? ¿Qué áreas de matemáticas se solicitan típicamente?

Cómo usar de manera óptima los seis meses que tengo para mejorar en Python

Cómo lidiar con las preguntas cuando se hacen en entrevistas de programación pero no es posible resolverlas en una hora

¿La revisión del código se aprendió en la universidad con roles (moderador, lector, inspector, etc.) realmente utilizados en Google, Microsoft y Amazon?

Como programador competitivo, ¿cuál debería ser su enfoque cuando un entrevistador hace una pregunta fácil / moderada que puede resolver fácilmente?

¿Cómo y cuándo implementas Comparator en Java?

¿Cuál es la diferencia entre bibliotecas vinculadas estáticamente y bibliotecas cargadas dinámicamente?

¿Cuáles son los requisitos previos para programar entrevistas en empresas tecnológicas y recomendar libros?

Dada una matriz entera y un número constante X, imprima todos los pares de números en la matriz cuyo producto es igual a X. Seguimiento: ¿cómo lo hará en O (n)? ¿Cómo manejarás los pares duplicados?

Para entrevistas técnicas en empresas tecnológicas de primer nivel, ¿cuánto tiempo tienen los candidatos para cada pregunta de programación?

¿Dónde encuentro más preguntas de diseño de software con una posible respuesta como se proporciona en la entrevista de Cracking the Coding?

¿Cuáles son algunas preguntas de la entrevista de ciencia de datos? ¿Incluyen preguntas de algoritmos canónicos tales como búsqueda, gráficos, estructuras de datos, etc.?

Cómo prepararse para una entrevista técnica con una organización utilizando codificación, algoritmos, estructuras de datos, árboles binarios, listas vinculadas, análisis / diseño orientado a objetos, patrones de diseño y habilidades de microservicios