剑指 Offer II 058. 日程表(729. 我的日程安排表 I)
题目:
思路:
【1】暴力破解的方式:
【2】二分查找的方式:
代码展示:
二分查找的方式:
//时间24 ms击败73.28% //内存42.3 MB击败55.84% //时间复杂度:O(nlogn), 其中 n 表示日程安排的数量。由于每次在进行预订时,都需要进行二分查找,需要的时间为 O(logn)。 //空间复杂度:O(n),其中 n 表示日程安排的数量。需要保存所有已经预订的行程。 class MyCalendar { TreeSet<int[]> booked; public MyCalendar() { booked = new TreeSet<int[]>((a, b) -> a[0] - b[0]); } public boolean book(int start, int end) { if (booked.isEmpty()) { booked.add(new int[]{start, end}); return true; } int[] tmp = {end, 0}; int[] arr = booked.ceiling(tmp); int[] prev = arr == null ? booked.last() : booked.lower(arr); if (arr == booked.first() || booked.lower(tmp)[1] <= start) { booked.add(new int[]{start, end}); return true; } return false; } }
暴力破解的方式:
//时间80 ms击败29.89% //内存42.2 MB击败53.83% //时间复杂度:O(n^2), 其中 n 表示日程安排的数量。由于每次在进行预订时,都需要遍历所有已经预订的行程安排。 //空间复杂度:O(n)O,其中 n 表示日程安排的数量。需要保存所有已经预订的行程。 class MyCalendar { List<int[]> booked; public MyCalendar() { booked = new ArrayList<int[]>(); } public boolean book(int start, int end) { for (int[] arr : booked) { int l = arr[0], r = arr[1]; if (l < end && start < r) { 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); */