Из теста известного (известного) кодирующего сайта: заданный нулевым индексом массив целых чисел A[N]
, мы можем определить "яму" (этого массива) триплет целых чисел (P,Q,R)
такой, что они следуйте этим правилам:
0 ≤ P < Q < R < N
A[P] > A[P+1] > ... > A[Q]
(строго уменьшается) и
A[Q] < A[Q+1] < ... < A[R]
(строго возрастает).
Мы также можем определить глубину этой ямы как число
min{A[P] − A[Q], A[R] − A[Q]}
.
Вы должны написать Java-метод (функция) deepest_pit(int[] A)
, который возвращает глубину самой глубокой ямы в массиве A
или -1
, если она не выйдет.
Costraints: N
- целое число в диапазоне [1..1,000,000];
, каждый элемент массива A
является целым числом в диапазоне [−100,000,000..100,000,000]
.
Я написал функцию "грубой силы" с тремя циклами "для", и даже если каждый внутренний цикл работает под подмножеством элементов, и вы можете пропустить каждый несовместимый триплет, конечно, это не лучшее решение. Я чувствую, что есть что-то о деревьях (картезианских?) И стеках, конечно. Сложность решения должна быть O (N).
ОБНОВЛЕНИЕ
Моя попытка после подсказок @Matzi:
public static int dp(int[] A) {
int N = A.length;
int depth = -1;
int P, Q, R;
int i = 0, j, k;
while (i < N - 2) {
P = A[i];
j = i + 1;
int p = P;
while (j < N - 1 && A[j] < p) {
p = A[j++];
}
if (j == N - 1) {
break;
}
if (j > i + 1) {
Q = A[j - 1];
} else {
i++;
continue;
}
k = j;
int q = Q;
while (k < N && A[k] > q) {
q = A[k++];
}
if (k > j) {
R = A[k - 1];
depth = Math.max(depth, Math.min(P - Q, R - Q));
i = k - 1;
} else {
i = j - 1;
}
}
return Math.max(depth, -1);
}