我的日程安排表(理解代码)学习记录Java
生活随笔
收集整理的這篇文章主要介紹了
我的日程安排表(理解代码)学习记录Java
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.直接遍歷比較簡單,主要是找到時間段是不是可以預定的時間,即對于集合中已有的元素(有沒有元素都一樣)進行遍歷比較,任意拿到一個集合元素時[left, right) 與 [start, end)需要一個預定條件 ==> left >= end || start >= right 那么可知條件非為 ==> left < end && start < right, 此時產生交集,不可加入其中,返回false。
class MyCalendar {List<int[]> booked;public MyCalendar() {booked = new ArrayList<int[]>(); }public boolean book(int start, int end) {for(int[] arr : booked){int left = arr[0], right = arr[1];if (left < end && start < right){return false;}}booked.add(new int[]{start, end});return true;} }/*** Your MyCalendar object will be instantiated and called as such:* MyCalendar obj = new MyCalendar();* boolean param_1 = obj.book(start,end);*/二.二分查找,首先通過重寫比較器,指定大小規則,即按照集合元素數組第一個元素大小進行比較升序。此時尋找大于或者等于end的元素[left1, right1)和前一個集合[left2, right2),那么條件為right2 <= start < end <= left1,可以預定 ==> 當找到比end大或者等于的元素時,看前一個元素的right2是否比start小,滿足就可以預定,其他情況同理,代碼中舉了兩個例子,希望可以幫助您的理解。
class MyCalendar {TreeSet<int[]> booked;public MyCalendar() {// 比較器重寫 按集合數組第一個元素大小進行升序booked = new TreeSet<int[]>((o1, o2) -> o1[0] - o2[0]); }public boolean book(int start, int end) {// 集合為空,直接預訂if (booked.isEmpty()){booked.add(new int[]{start, end});return true;}// 假設集合中已有[[10, 20]] ,現存儲[15, 27];// 假設集合中已有[[10, 20]], 現存儲[5, 10];// 大于等于end的第一個區間為[l1,r1),前一個區間[l2,r2);預定條件:r2 <= start < end <= l1// 臨時數組,存儲當前end時間// temp = [15, 0]// temp = [5, 0]int[] temp = {end, 0};// ceiling(E e)返回此集中大于或等于(以重寫的比較器比較)給定元素的最小元素,或者如果沒有此類元素。null// 獲取l1// arr = null (15 > 10 沒有比給定元素大于等于的元素)// arr = [10, 20] (5 < 10 存在比給定元素大于等于的元素)int[] arr = booked.ceiling(temp);// last()返回此集中當前的最后一個(最高)元素。// lower(E e)返回此集中嚴格小于給定元素的最大元素,或者如果沒有此類元素。null// 獲取r2 ,prev存在兩種情況:集合中元素沒有比end大 ==> 獲取當前最大元素數組;存在比end大的元素 ==> 獲取前一個元素數組// arr 為空, prev = [10, 20];// arr不為空, prev = null// int[] prev = arr == null ? booked.last() : booked.lower(arr);// first()返回此集中當前第一個(最低)元素。// arr 與 [10, 20]不匹配 false || [10, 20]中20 > 15 false ==> false// arr 與 [10, 20]匹配 true ==> true加入集合if (arr == booked.first() || booked.lower(temp)[1] <= start){booked.add(new int[]{start, end});return true;}return false;} }/*** Your MyCalendar object will be instantiated and called as such:* MyCalendar obj = new MyCalendar();* boolean param_1 = obj.book(start,end);*/總結
以上是生活随笔為你收集整理的我的日程安排表(理解代码)学习记录Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对进程的隐藏技术
- 下一篇: 快速搞懂Oracle 19c安全新特性