剑指 Offer II 058. 日程表(729. 我的日程安排表 I)

题目:

 

 

思路:

【1】暴力破解的方式:

【2】二分查找的方式:

代码展示:

二分查找的方式:

//时间24 ms击败73.28%
//内存42.3 MB击败55.84%
//时间复杂度:O(nlog⁡n), 其中 n 表示日程安排的数量。由于每次在进行预订时,都需要进行二分查找,需要的时间为 O(log⁡n)。
//空间复杂度: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);
 */

 

posted @ 2023-03-23 12:35  忧愁的chafry  阅读(35)  评论(0编辑  收藏  举报