[Persyaratan Pertanyaan] memberi Anda N angka dan n. Sekarang Anda perlu menemukan angka yang terjadi lebih dari 50% kali dalam ruang O (n) dalam O (1).
[Mulai omong kosong] Pada awalnya, saya melihat pertanyaan ini langsung dibutakan (tot)/~~~ (.*). Jika hanya ada persyaratan waktu O (n), itu dapat diselesaikan secara instan dengan hash (yaitu, dengan ruang waktu), dan tampaknya sulit untuk menyelesaikan ruang O (1).
[Pikiran 1] Loop ganda, ini adalah cara yang paling tidak efisien untuk menyelesaikan masalah ini, yaitu, menghitung berapa kali muncul untuk setiap angka, dan kompleksitas waktu O (n^2) langsung keluar.
[Pikirkan 2] Sortir pertama, biarkan angka yang sama diatur bersama, dan kemudian melintasi dari angka pertama. Sekarang berikan contoh, seperti: 1000012, sekarang sortir: 0000112, mulai dari 0, atur counter t = 0, sekarang ada 4 0s, lalu t = 4, temukan lebih dari setengahnya, output 0. Metode ini adalah versi yang dioptimalkan dari metode sebelumnya, keluar.
[Pikiran 3] Ini adalah gagasan bertukar ruang untuk waktu dan hashing untuk membuat array satu dimensi memiliki dua makna. Misalnya, [x] = y menyatakan bahwa angka x muncul y kali. Kompleksitas waktu dari metode ini adalah O (n), tetapi ruangnya benar -benar ... Saya tidak akan membicarakannya (*  ̄ ̄)
[Pikirkan 4] Pertama -tama hitung probabilitas, pilih jumlah angka -angka ini yang paling mungkin memenuhi persyaratan, dan kemudian pilih beberapa secara acak. Ini ... lupakan saja.
[Pikiran 5] Topik hari ini adalah apa yang disebut algoritma MJRTY, juga dikenal sebagai algoritma pemungutan suara mayoritas. Ide utamanya adalah sebagai berikut: (kompleksitas waktu algoritma ini adalah O (n)! Tidak perlu penyimpanan ekstra di ruang angkasa, jadi kompleksitas ruangnya adalah O (1) !!!)
Jika Count == 0, atur nilai suara ke elemen array saat ini dan tetapkan hitungan ke 1;
Jika tidak, jika elemen VOTE dan sekarang array memiliki nilai yang sama, hitung ++, jika tidak hitung;
Ulangi dua langkah di atas sampai array dipindai.
Hitungan ditugaskan ke 0, dan pindai array lagi dari awal. Jika nilai elemen array sama dengan nilai suara, hitung ++ sampai array dipindai.
Jika nilai jumlah lebih besar dari atau sama dengan n/2 saat ini, nilai suara akan dikembalikan, jika tidak -1 akan dikembalikan;
Berikut ini adalah implementasi kode. Karena pertanyaan memastikan bahwa hasilnya harus ada, kami menghilangkan langkah terakhir dari pemeriksaan dan verifikasi.
Kode kuncinya adalah sebagai berikut:
#include <ioStream> menggunakan namespace std; int len; void find (int* a, int n) {calon char; int ntimes, i; for (i = ntimes = 0; i <n; i ++) {if (ntimes == 0) kandidat = a [i], nTimes = 1; else {if (kandidat == a [i]) ntime ++; ntimes-} {if (kandidat == a [i]) ntime ++; ntime-—}}} candidate; candides;} candides; candides;} candides;} candides;} candides;} candides;} ntimes; } int main () {cin >> len; int a [len]; for (int i = 0; i <n; i ++) cin >> a [i]; find (a, len); sistem ("jeda"); return 0;}Di atas adalah jumlah lebih dari setengah (50%) dari jumlah kejadian yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!