729. Kalendar Saya Saya
Kesukaran: Sederhana
Topik: Tatasusunan, Carian Binari, Reka Bentuk, Pokok Segmen, Set Tertib
Anda sedang melaksanakan program untuk digunakan sebagai kalendar anda. Kami boleh menambah acara baharu jika menambah acara tidak akan menyebabkan tempahan berganda.
tempahan berganda berlaku apabila dua acara mempunyai beberapa persimpangan yang tidak kosong (iaitu, beberapa saat adalah perkara biasa bagi kedua-dua acara.).
Acara ini boleh diwakili sebagai sepasang integer bermula dan berakhir yang mewakili tempahan pada selang separuh terbuka [mula, tamat), julat nombor nyata x seperti mula <= x < tamat.
Laksanakan kelas MyCalendar:
Contoh 1:
["MyCalendar", "book", "book", "book"] [[], [10, 20], [15, 25], [20, 30]]
[null, true, false, true]
MyCalendar myCalendar = new MyCalendar(); myCalendar.book(10, 20); // return True myCalendar.book(15, 25); // return False, It can not be booked because time 15 is already booked by another event. myCalendar.book(20, 30); // return True, The event can be booked, as the first event takes every time less than 20, but not including 20.
Kekangan:
Petunjuk:
Penyelesaian:
Kami perlu menyimpan setiap acara dan menyemak sama ada acara baharu itu bercanggah dengan mana-mana acara sedia ada sebelum menempahnya. Memandangkan paling banyak 1000 panggilan untuk menempah dibenarkan, kami boleh menyimpan acara dalam senarai dan melelang melaluinya untuk menyemak pertindihan semasa menempah acara baharu.
Mari laksanakan penyelesaian ini dalam PHP: 729. Kalendar Saya I
book($start, $end); */ // Example Usage: $myCalendar = new MyCalendar(); var_dump($myCalendar->book(10, 20)); // true, no conflicts, booking added var_dump($myCalendar->book(15, 25)); // false, conflict with [10, 20] var_dump($myCalendar->book(20, 30)); // true, no conflicts, booking added ?>Penjelasan:
Pembina (__construct): Memulakan tatasusunan kosong $events untuk menjejaki semua acara yang ditempah.
Fungsi Tempahan (buku):
- Ia memerlukan permulaan dan penghujung acara baharu.
- Ia berulang melalui senarai acara yang ditempah sebelum ini dan menyemak sebarang pertindihan:
- Pertindihan berlaku jika acara baharu bermula sebelum acara sedia ada berakhir ($start < $bookedEnd) dan berakhir selepas acara sedia ada bermula ($end > $bookedStart).
- Jika sebarang pertindihan ditemui, fungsi tersebut akan mengembalikan palsu, bermakna acara tidak boleh ditempah.
- Jika tiada konflik ditemui, acara akan ditambahkan pada tatasusunan $events dan fungsi kembali benar untuk menunjukkan tempahan yang berjaya.
Kerumitan Masa:
Tempahan Pertama (buku(10, 20)):
Tempahan Kedua (buku(15, 25)):
Tempahan Ketiga (buku(20, 30)):
Pendekatan mudah ini mengendalikan sehingga 1000 acara dengan cekap sambil mengekalkan kejelasan dan ketepatan.
Pautan Kenalan
Jika anda mendapati siri ini membantu, sila pertimbangkan untuk memberi repositori bintang di GitHub atau berkongsi siaran pada rangkaian sosial kegemaran anda ?. Sokongan anda amat bermakna bagi saya!
Jika anda mahukan kandungan yang lebih berguna seperti ini, sila ikuti saya:
Atas ialah kandungan terperinci . Kalendar Saya I. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!