Я застрял в решении следующего вопроса о практике интервью:
Мне нужно написать функцию:
int triangle(int[] A);
, для которой задан индексированный нулем массив A, состоящий из N
целых чисел, возвращает 1
если существует тройка (P, Q, R) такая, что 0 < P < Q < R < N
.
A[P] + A[Q] > A[R],
A[Q] + A[R] > A[P],
A[R] + A[P] > A[Q].
Функция должна возвращать 0
, если такой тройки не существует.Предположим, что 0 < N < 100,000
.Предположим, что каждый элемент массива представляет собой целое число в диапазоне [-1,000,000..1,000,000]
.
Например, данный массив A
такой, что
A[0]=10, A[1]=2, A[2]=5, A[3]=1, A[4]=8, A[5]=20
функция должна возвращать 1
, посколькутройка (0, 2, 4)
удовлетворяет всем необходимым условиям.
Для массива A
, для которого
A[0]=10, A[1]=50, A[2]=5, A[3]=1
, функция должна вернуть 0
.
Если ясделать тройной цикл, это будет очень очень медленно (сложность: O(n^3)
).Я думаю, может быть, использовать для хранения дополнительной копии массива и сортировки его, а также использовать двоичный поиск для определенного числа.Но я не знаю, как решить эту проблему.
Есть идеи?