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.
- ¿Cuál es la diferencia entre la edición estándar y la edición india de Cracking the Coding Interview, 2011, sexta edición?
- ¿Cuál debería ser tu reacción en una entrevista cuando no sabes la respuesta a la pregunta que te han hecho?
- ¿Cuál es el mejor libro para prepararse para una entrevista de desarrollador junior de Java?
- En entrevistas tecnológicas, ¿cómo podemos escribir un código que sea limpio, conciso, optimizado en tiempo y espacio y que cubra todos los casos básicos y de borde de una vez?
- ¿Será difícil descifrar la entrevista del desarrollo de Android con solo el conocimiento básico de la estructura de datos y el algoritmo y no más que eso para los principiantes? ¿Las preguntas son demasiado complejas?
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; } }