Saya percaya saya telah datang dengan sesuatu yang harus bekerja secara umum dan efisien jika Anda dijamin tidak memiliki duplikat * (namun, itu harus diperluas ke sejumlah lubang dan berbagai bilangan bulat).
Gagasan di balik metode ini seperti quicksort, di mana kita menemukan pivot dan partisi di sekitarnya, kemudian muncul kembali pada sisi dengan lubang. Untuk melihat sisi mana yang memiliki lubang, kami menemukan angka terendah dan tertinggi, dan membandingkannya dengan pivot dan jumlah nilai di sisi itu. Katakanlah pivot adalah 17 dan angka minimum adalah 11. Jika tidak ada lubang, harus ada 6 angka (11, 12, 13, 14, 15, 16, 17). Jika ada 5, kita tahu ada lubang di sisi itu dan kita bisa melihat lagi di sisi itu untuk menemukannya. Saya kesulitan menjelaskannya lebih jelas dari itu, jadi mari kita ambil contoh.
15 21 10 13 18 16 22 23 24 20 17 11 25 12 14
Poros:
10 13 11 12 14 |15| 21 18 16 22 23 24 20 17 25
15 adalah pivot, ditunjukkan oleh pipa ( ||
). Ada 5 angka di sisi kiri pivot, karena harus ada (15 - 10), dan 9 di kanan, di mana harus ada 10 (25 - 15). Jadi kita berulang di sisi kanan; kami akan mencatat bahwa batas sebelumnya adalah 15 jika lubang berdekatan (16).
[15] 18 16 17 20 |21| 22 23 24 25
Sekarang ada 4 angka di sisi kiri tetapi harus ada 5 (21 - 16). Jadi kita mengulanginya di sana, dan sekali lagi kita akan perhatikan ikatan sebelumnya (dalam kurung).
[15] 16 17 |18| 20 [21]
Sisi kiri memiliki 2 angka yang benar (18 - 16), tetapi kanan memiliki 1 bukan 2 (20 - 18). Bergantung pada kondisi akhir kami, kami dapat membandingkan 1 angka dengan dua sisi (18, 20) dan melihat bahwa 19 hilang atau berulang sekali lagi:
[18] |20| [21]
Sisi kiri memiliki ukuran nol, dengan celah antara pivot (20) dan ikatan sebelumnya (18), jadi 19 adalah lubangnya.
*: Jika ada duplikat, Anda mungkin bisa menggunakan hash set untuk menghapusnya dalam waktu O (N), menjaga metode keseluruhan O (N), tetapi itu mungkin membutuhkan waktu lebih lama daripada menggunakan beberapa metode lain.