LeetCode #729 My Calendar I 我的日程安排表 I

729 My Calendar I 我的日程安排表 I

Description:
You are implementing a program to use as your calendar. We can add a new event if adding the event will not cause a double booking.

A double booking happens when two events have some non-empty intersection (i.e., some moment is common to both events.).

The event can be represented as a pair of integers start and end that represents a booking on the half-open interval [start, end), the range of real numbers x such that start <= x < end.

Implement the MyCalendar class:

MyCalendar() Initializes the calendar object.
boolean book(int start, int end) Returns true if the event can be added to the calendar successfully without causing a double booking. Otherwise, return false and do not add the event to the calendar.

Example:

Example 1:

Input
["MyCalendar", "book", "book", "book"]
[[], [10, 20], [15, 25], [20, 30]]
Output
[null, true, false, true]

Explanation

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.

Constraints:

0 <= start < end <= 10^9
At most 1000 calls will be made to book.

題目描述:
實(shí)現(xiàn)一個(gè) MyCalendar 類來存放你的日程安排。如果要添加的時(shí)間內(nèi)沒有其他安排,則可以存儲(chǔ)這個(gè)新的日程安排腻菇。

MyCalendar 有一個(gè) book(int start, int end)方法状勤。它意味著在 start 到 end 時(shí)間內(nèi)增加一個(gè)日程安排三圆,注意爬立,這里的時(shí)間是半開區(qū)間,即 [start, end), 實(shí)數(shù) x 的范圍為司顿, start <= x < end伴找。

當(dāng)兩個(gè)日程安排有一些時(shí)間上的交叉時(shí)(例如兩個(gè)日程安排都在同一時(shí)間內(nèi))盈蛮,就會(huì)產(chǎn)生重復(fù)預(yù)訂。

每次調(diào)用 MyCalendar.book方法時(shí)技矮,如果可以將日程安排成功添加到日歷中而不會(huì)導(dǎo)致重復(fù)預(yù)訂抖誉,返回 true殊轴。否則,返回 false 并且不要將該日程安排添加到日歷中寸五。

請(qǐng)按照以下步驟調(diào)用 MyCalendar 類: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)

示例 :

示例 1:

MyCalendar();
MyCalendar.book(10, 20); // returns true
MyCalendar.book(15, 25); // returns false
MyCalendar.book(20, 30); // returns true

解釋:
第一個(gè)日程安排可以添加到日歷中. 第二個(gè)日程安排不能添加到日歷中,因?yàn)闀r(shí)間 15 已經(jīng)被第一個(gè)日程安排預(yù)定了耿币。
第三個(gè)日程安排可以添加到日歷中梳杏,因?yàn)榈谝粋€(gè)日程安排并不包含時(shí)間 20 。

說明:

每個(gè)測(cè)試用例淹接,調(diào)用 MyCalendar.book 函數(shù)最多不超過 1000次十性。
調(diào)用函數(shù) MyCalendar.book(start, end)時(shí), start 和 end 的取值范圍為 [0, 10^9]塑悼。

思路:

  1. 有序列表
    因?yàn)?start 和 end 的取值范圍為 [0, 10^9]
    可以設(shè)置兩個(gè)哨兵 (-2, -1), (10 ** 9 + 1, 10 ** 9 + 2) 保證 start 和 end 在這個(gè)區(qū)間內(nèi)
    每次使用二分查找查找插入的位置
    判斷區(qū)間的位置及進(jìn)行合并操作
    時(shí)間復(fù)雜度為 O(nlgn), 空間復(fù)雜度為 O(n)
  2. 平衡二叉樹
    用 C++ 中的 map 保證插入有序
    每次使用二分查找查找插入的位置并判斷區(qū)間的位置
    時(shí)間復(fù)雜度為 O(nlgn), 空間復(fù)雜度為 O(n)

代碼:
C++:

class MyCalendar 
{
private:
    map<int, int> data;
public:
    MyCalendar() {}
    
    bool book(int start, int end)
    {
        auto it = data.lower_bound(end);
        if (it != data.begin() and (--it) -> second > start) return false;
        data[start] = end;
        return true;
    }
};

/**
 * Your MyCalendar object will be instantiated and called as such:
 * MyCalendar* obj = new MyCalendar();
 * bool param_1 = obj->book(start,end);
 */

Java:

class MyCalendar {

    private List<int[]> data;
    public MyCalendar() {
        data = new ArrayList<int[]>();
        data.add(new int[]{ -2, -1 });
        data.add(new int[]{ 1000000001, 1000000002 });
    }
    
    public boolean book(int start, int end) {
        int l = 0, r = data.size() - 1;
        while (l < r) {
            int mid = l + ((r - l) >> 1);
            if (start > data.get(mid)[0]) l = mid + 1;
            else r = mid;
        }
        if (start >= data.get(l - 1)[1] && end <= data.get(l)[0]) {
            data.add(l, 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);
 */

Python:

class MyCalendar:

    def __init__(self):
        self.data = [(-2, -1), (10 ** 9 + 1, 10 ** 9 + 2)]

        
    def book(self, start: int, end: int) -> bool:
        l, r = 0, len(self.data) - 1
        while l < r:
            mid = l + ((r - l) >> 1)
            if start > self.data[mid][0]:
                l = mid + 1
            else:
                r = mid
        if start >= self.data[l - 1][1] and end <= self.data[l][0]:
            self.data.insert(l, (start, end))
            return True
        return False


# Your MyCalendar object will be instantiated and called as such:
# obj = MyCalendar()
# param_1 = obj.book(start,end)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劲适,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子厢蒜,更是在濱河造成了極大的恐慌霞势,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斑鸦,死亡現(xiàn)場(chǎng)離奇詭異愕贡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巷屿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門固以,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘱巾,你說我怎么就攤上這事憨琳。” “怎么了旬昭?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵篙螟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我问拘,道長(zhǎng)闲擦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任场梆,我火速辦了婚禮墅冷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘或油。我一直安慰自己寞忿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布顶岸。 她就那樣靜靜地躺著腔彰,像睡著了一般叫编。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霹抛,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天搓逾,我揣著相機(jī)與錄音,去河邊找鬼杯拐。 笑死霞篡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的端逼。 我是一名探鬼主播朗兵,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼顶滩!你這毒婦竟也來了余掖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤礁鲁,失蹤者是張志新(化名)和其女友劉穎盐欺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仅醇,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡找田,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了着憨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墩衙。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖甲抖,靈堂內(nèi)的尸體忽然破棺而出漆改,到底是詐尸還是另有隱情,我是刑警寧澤准谚,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布挫剑,位于F島的核電站,受9級(jí)特大地震影響柱衔,放射性物質(zhì)發(fā)生泄漏樊破。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一唆铐、第九天 我趴在偏房一處隱蔽的房頂上張望哲戚。 院中可真熱鬧,春花似錦艾岂、人聲如沸顺少。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脆炎。三九已至梅猿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秒裕,已是汗流浹背袱蚓。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留几蜻,地道東北人喇潘。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像入蛆,于是被迫代替她去往敵國(guó)和親响蓉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硕勿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容