前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang刷leetcode 技巧(7) 我的日程安排表 I

golang刷leetcode 技巧(7) 我的日程安排表 I

作者头像
golangLeetcode
发布2022-08-02 18:38:06
3050
发布2022-08-02 18:38:06
举报
文章被收录于专栏:golang算法架构leetcode技术php

MyCalendar 有一个 book(int start, int end)方法。它意味着在 start 到 end 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为, start <= x < end。

当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生重复预订。

每次调用 MyCalendar.book方法时,如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true。否则,返回 false 并且不要将该日程安排添加到日历中。

请按照以下步骤调用 MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)

代码语言:javascript
复制
示例 1:


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

解释:

第一个日程安排可以添加到日历中. 第二个日程安排不能添加到日历中,因为时间 15 已经被第一个日程安排预定了。

第三个日程安排可以添加到日历中,因为第一个日程安排并不包含时间 20 。

实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排,则可以存储这个新的日程安排。

代码语言:javascript
复制
说明:


每个测试用例,调用 MyCalendar.book 函数最多不超过 100次。
调用函数 MyCalendar.book(start, end)时, start 和 end 的取值范围为 [0, 10^9]。

解题思路1:

1,暴力解法

2,每次插入的时候存入一个有序的list

3,如果能插入则成功

4,否则是失败的

代码实现1:

代码语言:javascript
复制
type MyCalendar struct {
    ts [][]int
}


func Constructor() MyCalendar {
    return MyCalendar{}
}


func (this *MyCalendar) Book(start int, end int) bool {
    if len(this.ts)==0{
        this.ts=append(this.ts,[]int{start,end})
        return true
    }

    if end <=this.ts[0][0]{
        this.ts=append([][]int{[]int{start,end}},this.ts...)
        return true
    }
    if start>=this.ts[len(this.ts)-1][1]{
        this.ts=append(this.ts,[]int{start,end})
        return true
    }
    index:=0
    for i:=1;i<len(this.ts);i++{
        if this.ts[i][1]>start{
            index=i-1
            break
        }
    }
    if this.ts[index][1]<=start &&this.ts[index+1][0]>=end{
        t:=append(this.ts[:index+1:index+1],[]int{start,end})
        this.ts=append(t,this.ts[index+1:]...)
        return true
    }
    return false
}


/**
 * Your MyCalendar object will be instantiated and called as such:
 * obj := Constructor();
 * param_1 := obj.Book(start,end);
 */

解题思路2:

1.构造线段树节点。

2.新添加的线段树节点,要么只能全在node.start往左,要么只能全在node.end往右。

3.左右子树如果不存在,这表示该区间不存在,可以插入,如果存在,则往其左右子树递推即可。

4.不满足条件的则表示与当前节点的区间发生了重叠,不能插入。

代码实现2

代码语言:javascript
复制
type MyCalendar struct {
    root *Node
}
type Node struct{
    start int
    end int
    left *Node
    right *Node
}


func Constructor() MyCalendar {
    return MyCalendar{}
}


func (this *MyCalendar) Book(start int, end int) bool {
    if this.root==nil{
        this.root=&Node{start:start,end:end}
        return true
    }

    n:=this.root
    for true{
        if end<=n.start{
            if n.left==nil{
                n.left=&Node{start:start,end:end}
                return true
            }
           n=n.left
        }else if start>=n.end{
            if n.right==nil{
                n.right=&Node{start:start,end:end}
                return true
            }
            n=n.right
        }else{
            return false
        }
    }
    return false
}


/**
 * Your MyCalendar object will be instantiated and called as such:
 * obj := Constructor();
 * param_1 := obj.Book(start,end);
 */
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档