Вот код на Python 3, который решает вашу проблему.Это должно быть легко понять, даже если вы не знаете Python.
Эта процедура использует вашу идею сортировки массива, но я использую две переменные left
и right
(которые определяют два места вмассив), где каждый делает только один проход через массив.Поэтому, кроме сортировки, эффективность моего кода по времени составляет O(N)
.Сортировка делает всю рутину O(N log N)
.Это лучше, чем ваш код, который равен O(N^2)
.
. Я никогда не использую введенное значение N
, поскольку Python может легко обрабатывать фактический размер массива.Я добавляю дозорное значение в конец массива, чтобы сделать внутренние короткие циклы проще и быстрее.Это включает в себя еще один проход через массив для вычисления значения часового, но это мало увеличивает время выполнения.Можно уменьшить количество обращений к массиву за счет еще нескольких строк кода - я оставлю это вам.Я добавил подсказки ввода, чтобы помочь моему тестированию - вы можете удалить их, чтобы приблизить мои результаты к тому, что вы, кажется, хотите.Мой код сначала печатает большее из двух чисел, затем меньшее, что соответствует вашему примеру вывода.Но вы, возможно, хотели, чтобы порядок двух чисел соответствовал порядку в исходном несортированном массиве - если это так, я также позволю вам справиться с этим (я вижу несколько способов сделать это).
# Get input
N, K = [int(s) for s in input('Input N and K: ').split()]
arr = [int(s) for s in input('Input the array: ').split()]
arr.sort()
sentinel = max(arr) + K + 2
arr.append(sentinel)
left = right = 0
while arr[right] < sentinel:
# Move the right index until the difference is too large
while arr[right] - arr[left] < K:
right += 1
# Move the left index until the difference is too small
while arr[right] - arr[left] > K:
left += 1
# Check if we are done
if arr[right] - arr[left] == K:
print(arr[right], arr[left])
break