Diberikan array bilangan bulat yang diurutkan, saya ingin menemukan jumlah pasangan yang berjumlah . Misalnya, mengingat , jumlah pasangan yang dijumlahkan menjadi nol adalah .
Misalkan adalah jumlah elemen dalam array input. Jika saya menggunakan pencarian biner untuk menemukan invers terbalik untuk elemen dalam array, urutannya adalah . Jika saya melintasi semua elemen di set, maka urutannya adalah .
Bagaimana menemukan algoritma yang orde ?
algorithms
Laura
sumber
sumber
Jawaban:
Biarkan menjadi array input yang diurutkan. Menjaga dua pointer dan yang masuk melalui elemen-elemen di . Pointer akan melewati "bagian kiri" dari , yaitu bilangan bulat negatif. Pointer melakukan hal yang sama untuk "bagian kanan", bilangan bulat positif. Di bawah ini, saya akan menguraikan solusi pseudocode dan menganggap bahwa untuk kesederhanaan kecil. Dihilangkan juga pemeriksaan untuk kasus-kasus di mana hanya ada positif atau hanya bilangan bulat negatif dalam .A l r A l A r 0∉A A
Jelas algoritma membutuhkan waktu .O(N)
sumber
Pendekatan paling sederhana, menurut pemahaman saya, tampaknya menggunakan Tabel-Hash, H = {a [0] = true, .., a [n-1] = true}. Hash-Table ini dapat dibangun dalam waktu O (n). Setelah Tabel-Hash dibuat, lakukan iterasi melalui A [0, .., n-1] dan periksa apakah H [-1 * a [i]] ada. Jika ya, tambahkan penghitung sebanyak 1, dan kembalikan hasil akhirnya. Ini jelas O (n).
sumber
Perhatikan bahwa kita dapat mencari nilai dalam Python yang diset dalam waktu konstan.
sumber