Одна идея такова:
- Давайте назовем исходный массив A
- , сохраняя массив min [] размера n, из которого min [i] означает минимальное значениеподмассив A [i..n-1].Очевидно, min [i] <= min [i + 1]. </li>
- теперь перемещается справа налево на A. По каждому индексу i выполните бинарный поиск по min [i + 1..n-1.], чтобы найти самое маленькое значение.
Java-код:
int[] A = { 6, 2, 3, 10, 1, 8 };
int n = A.length;
// calculate min
int[] min = new int[n];
min[n - 1] = A[n - 1];
for (int i = n - 2; i >= 0; i--)
min[i] = Math.min(A[i], min[i + 1]);
// calculate results
int[] results = new int[n];
results[n - 1] = -1;
for (int i = n - 2; i >= 0; i--) {
int left = i; // after the binary search, A[left] would be the answer
int right = n - 1;
while (left < right) {
int mid = left + (right - left + 1) / 2;
if (min[mid] < A[i])
left = mid;
else
right = mid - 1;
if (min[left] < A[i])
results[i] = min[left];
else
results[i] = -1;
}
}
Пространственная сложность O (n)
Временная сложность O (nlogn) для всех случаев.
По сравнению с решением из @ vivek_23 приведенный выше алгоритм будет лучше в следующем худшем случае:
Представьте себе случай A из n элементов следующим образом
A= [n / 2 n / 2 .. n / 2 1 2 .. n / 2]
Если мы используем решение стека, предложенное @ vivek_23,
- на шагечтобы найти самый дальний меньший элемент из любого из первых n / 2 элементов (которые все имеют значение n / 2), теперь st1 должен быть равен [1 2 .. n / 2]
- для каждого элемента, имеющего значение n /2, все элементы st1, кроме n / 2, будут перенесены в st2, чтобы найти самый дальний элемент меньшего размера n / 2 - 1. После этого все элементы в st2 будут перенесены обратно в st1.Это приводит к худшей производительности O (n).Поскольку имеется n / 2 элемента, общая наихудшая временная производительность составляет O (n ^ 2).