【Leetcode】729. My Calendar I

题目地址:

https://leetcode.com/problems/my-calendar-i/

实现一个类,可以做如下操作:给定一个区间 [ a , b ] [a,b] [a,b],如果之前存储的区间里和这个区间没有相交的(端点重合不算),就将其插入返回true,否则不插入返回false。

可以用java里的TreeMap来做,key为区间左端点,value为对应的右端点。在插入时,先将左右两边左端点最靠近 a a a的区间找出来(可以用TreeMap的floorKey和ceilingKey方法来做),左边区间与 [ a , b ] [a,b] [a,b]不相交当且仅当左边区间不存在,或左边区间的右端点小于等于 a a a,而右边区间与 [ a , b ] [a,b] [a,b]不相交当且仅当右边区间不存在,或右边区间的左端点大于等于 b b b。代码如下:

import java.util.TreeMap;

public class MyCalendar {
    
    private TreeMap<Integer, Integer> map;
    
    public MyCalendar() {
        map = new TreeMap<>();
    }
    
    public boolean book(int start, int end) {
        Integer prev = map.floorKey(start), next = map.ceilingKey(start);
        if ((prev == null || map.get(prev) <= start) && (next == null || end <= next)) {
            map.put(start, next);
            return true;
        }
        
        return false;
    }
}

每次book时间复杂度 O ( log ⁡ n ) O(\log n) O(logn) n n n为已经在map里的元素个数,空间 O ( n ) O(n) O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值