Я вважаю, що я придумав щось, що повинно працювати в цілому та ефективно, якщо ви гарантовано не маєте дублікатів * (однак, воно повинне бути розширеним до будь-якої кількості дірок та будь-якого діапазону цілих чисел).
Ідея, що стоїть за цим методом, подібна до швидкості, у тому, що ми знаходимо шарнір і перегородку навколо нього, а потім повторюємо на стороні (ях) з отвором. Щоб побачити, на яких сторонах є отвір, ми знаходимо найменші та найвищі числа та порівнюємо їх із зведеними та числом значень на цій стороні. Скажіть, що шарнір дорівнює 17, а мінімальна кількість - 11. Якщо отворів немає, повинно бути 6 чисел (11, 12, 13, 14, 15, 16, 17). Якщо їх 5, ми знаємо, що на цій стороні є дірка, і ми можемо повторити її саме на цій стороні, щоб знайти її. У мене виникають труднощі з поясненням цього більш чітко, ніж це, тому візьмемо приклад.
15 21 10 13 18 16 22 23 24 20 17 11 25 12 14
Сверток:
10 13 11 12 14 |15| 21 18 16 22 23 24 20 17 25
15 - шарнір, позначений трубами ( ||
). З лівого боку повороту є 5 чисел, як і повинно бути (15 - 10), і 9 з правого, де має бути 10 (25 - 15). Отже, ми повторюємось з правого боку; зазначимо, що попередня межа була 15, якщо дірка примикає до неї (16).
[15] 18 16 17 20 |21| 22 23 24 25
Зараз ліворуч є 4 числа, але їх має бути 5 (21 - 16). Тож ми повторюємо там, і знову відзначимо попередній зв'язаний (у дужках).
[15] 16 17 |18| 20 [21]
Ліва сторона має правильні 2 числа (18 - 16), а права - 1 замість 2 (20 - 18). Залежно від наших умов закінчення, ми могли б порівняти 1 число на дві сторони (18, 20) і побачити, що 19 пропущено або повториться ще раз:
[18] |20| [21]
Ліва сторона має розмір нуля, із зазором між шарніром (20) та попередньою межею (18), тому 19 - отвір.
*: Якщо є дублікати, ви, ймовірно, можете використовувати хеш-набір, щоб видалити їх за час O (N), зберігаючи загальний метод O (N), але це може зайняти більше часу, ніж використання іншого методу.