729. 나의 달력Ⅰ
난이도:중
주제: 배열, 이진 검색, 디자인, 세그먼트 트리, 순서 집합
캘린더로 사용할 프로그램을 구현하고 계십니다. 이벤트를 추가해도 이중 예약이 발생하지 않는 경우 새 이벤트를 추가할 수 있습니다.
이중 예약은 두 이벤트에 비어 있지 않은 교차점이 있는 경우 발생합니다(예: 어떤 순간이 두 이벤트에 공통적임).
이벤트는 반개방 간격[시작, 종료)의 예약을 나타내는 정수 시작 및 종료 쌍, 시작 <= x < 끝.
MyCalendar 클래스 구현:
예 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.
제약조건:
힌트:
해결책:
각 이벤트를 저장하고 예약하기 전에 새 이벤트가 기존 이벤트와 충돌하는지 확인해야 합니다. 최대 1000번의 예약 호출이 허용되므로 이벤트를 목록에 저장하고 이를 반복하여 새 이벤트를 예약할 때 중복 여부를 확인할 수 있습니다.
이 솔루션을 PHP로 구현해 보겠습니다. 729. 나의 달력Ⅰ
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 ?>설명:
생성자(__construct): 예약된 모든 이벤트를 추적하기 위해 빈 배열 $events를 초기화합니다.
예약 기능(도서):
- 새로운 이벤트의 시작과 끝이 필요합니다.
- 이전에 예약된 이벤트 목록을 반복하고 중복되는 부분이 있는지 확인합니다.
- 기존 이벤트가 끝나기 전에 새 이벤트가 시작되고($start < $bookedEnd) 기존 이벤트가 시작된 후에 종료되면($end > $bookedStart) 중복이 발생합니다.
- 겹치는 부분이 발견되면 함수는 false를 반환하며 이는 이벤트를 예약할 수 없음을 의미합니다.
- 충돌이 발견되지 않으면 이벤트가 $events 배열에 추가되고 함수는 true를 반환하여 성공적인 예약을 나타냅니다.
시간 복잡도:
첫 예약(책(10, 20)):
두 번째 예약(책(15, 25)):
세 번째 예약(도서(20, 30)):
이 간단한 접근 방식은 명확성과 정확성을 유지하면서 최대 1000개의 이벤트를 효율적으로 처리합니다.
연락처 링크
如果您發現本系列有幫助,請考慮在 GitHub 上給 存儲庫 一個星號或在您最喜歡的社交網絡上分享該帖子? 。您的支持對我來說意義重大!
如果您想要更多類似的有用內容,請隨時關注我:
위 내용은 . 내 달력Ⅰ의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!