¿Cuál es la manera eficiente de encontrar todos los números en orden en una matriz en el tiempo O (N)?

Explicación
Puede resolver esto en dos pasos a través de la matriz.

En la primera pasada, identifica cada número que es mayor que los números que vienen antes. Lo haces iterando de izquierda a derecha. Si el número actual es mayor que el máximo en ejecución, entonces ese número es mayor que todos los números a la izquierda del mismo.

En el segundo pase, identifica cada número que es menor que los números que vienen después. Lo haces iterando de derecha a izquierda. Si el número actual es menor que el mínimo corriente, entonces ese número es menor que todos los números a la derecha del mismo.

La intersección de los candidatos de estos dos pases es su respuesta.

Código Java

import java.util.Arrays; public class InOrderNumbers { public static void main(String[] args) { int[] list = { 1, 20, 2, 40, 50 }; int[] inOrderNumbers = findInOrderNumbers(list); System.out.println(Arrays.toString(inOrderNumbers)); } public static int[] findInOrderNumbers(int[] list) { if (list == null) { return null; } int n = list.length; if (n == 0) { return new int[0]; } else if (n == 1) { return new int[] { list[0] }; } boolean[] candidates = new boolean[n]; candidates[0] = true; int curMax = list[0]; for (int i = 1; i  curMax) { candidates[i] = true; curMax = list[i]; } } int numCandidates = candidates[n - 1] ? 1 : 0; int curMin = list[n - 1]; for (int i = n - 2; i >= 0; i--) { if (list[i] < curMin) { curMin = list[i]; if (candidates[i]) { numCandidates++; } } else { candidates[i] = false; } } int[] answer = new int[numCandidates]; for (int i = 0, j = 0; i < n; i++) { if (candidates[i]) { answer[j++] = list[i]; } } return answer; } } 

Puede resolver esto en tiempo O (N) usando un espacio constante.

Itere sobre la matriz de principio a fin, rastreando el elemento de matriz más grande y el rango de coincidencia actual (si corresponde).

Si no tiene coincidencia y la entrada actual es más grande que cualquier otra vista, ese es el comienzo y el final de su rango.

Si tienes una coincidencia, sigue inmediatamente su final, y estás aumentando monotónicamente, ese es el nuevo final.

De lo contrario, siempre que seas más pequeño que el elemento final del rango, acortarás una entrada y restablecerás la coincidencia si te quedas sin entradas.

Aunque hay dos bucles anidados, mi solución es O (N) porque visita cada entrada como máximo dos veces: una vez hacia adelante y posiblemente una hacia atrás al acortar una secuencia coincidente al encontrar un número siguiente más pequeño que él.

  #include 
 #include 

 const int *
 get_ordered (const int * data, size_t count, size_t * count_out)
 {
     const int * begin, * end, * más grande, * i, * data_end;
     para (comienzo = fin = más grande = NULO, i = datos, fin_datos = datos + recuento;
          i  * más grande) {
             mayor = i;
         }

         if (! begin && * i> = * Mayor) {
             comenzar = i;
             final = i + 1;
         }

         if (end == i && * i> end [-1]) {
             ++ fin;
         } más {
             while (end && * i 

que se puede validar con

  #include 
 #include 

 hoyo estatico
 check_ordered (const char * name, const int * data, size_t count) {
     const int * data_end, * begin, * end, * i;
     size_t count_out;

     data_end = data + count;
     begin = get_ordered (data, count, & count_out);
     end = begin + count_out;

     afirmar (fin> = datos);
     afirmar (fin <= final_de_datos);

     afirmar (comenzar> = datos);
     afirmar (comenzar <= fin);

     printf ("% s in", nombre);
     for (i = data; i  i [-1]);
     }

     para (; i  fin [-1]);
     }

     printf ("\ n");
 }

productor

  vaciar adentro
 solo entrada 1 salida 1
 todo dentro 1 2 3 fuera 1 2 3
 ninguno en 3 2 1 fuera
 uno en 1 3 2 4 fuera 1
 dos en 1 2 4 3 5 fuera 1 2
 saltar 2 1 3 4 5 7 6 salir 3 4 5
 saltar2 en 2 1 4 6 3 5 7 fuera 7

More Interesting

¿Cuánto tiempo debería permitirme resolver un problema * difícil * de Leetcode?

¿Cuáles son algunas preguntas comunes en una entrevista de cuatro grandes?

En la codificación de entrevistas, soy bueno para encontrar el algoritmo correcto pero malo para implementarlo. Además de la respuesta obvia de practicar la codificación, ¿qué más debo hacer para mejorar?

¿Cuáles son los tipos de preguntas basadas en MapReduce que se hacen durante las entrevistas en Google?

¿Está predispuesto Facebook hacia los candidatos a entrevistas que son los mejores clasificados en las competencias de programación en línea?

¿Cuáles son algunos que deben saber las preguntas y respuestas de entrevistas específicas de Python?

¿Cómo debo prepararme para las entrevistas FSAE o BAJA?

¿Es malo usar funciones de lenguaje integradas en entrevistas técnicas?

¿Podemos encontrar el késimo número más pequeño en la matriz sin ordenar?

¿Cómo se borra una entrevista de codificación algorítmica una vez que ya se encuentra en la industria del software y ha perdido totalmente el contacto de la codificación algorítmica / Programación competitiva?

Cómo contar el número de formas únicas en una matriz que contiene muchas islas de 1s

¿Cuáles son las preguntas de la entrevista de programación relacionadas con multi-threading / sincronización en c?

¿Cuáles son las razones por las que solo 1 de 7 candidatos recibe una oferta después de una entrevista en el sitio de Google?

¿Cuáles son las preguntas más frecuentes en ASP.NET en una entrevista y cuáles se pueden preguntar si uno ha creado un sitio web universitario como parte de un proyecto?

¿Debo decirle al entrevistador que conozco la solución a la pregunta antes de explicar la solución?