字节跳动 2021 春招面试高频题2

今天我们来看一下字节跳动的另一类高频提,叫做Meeting Room。先来看一下题

问题描述

给定一系列的会议时间间隔,包括起始和结束时间[[s1,e1],[s2,e2],…(si < ei),确定一个人是否可以参加所有会议。

例子

输入: intervals = [(0,30),(5,10),(15,20)]
输出: false
解释:
(0,30), (5,10)(0,30),(15,20) 这两对会议会冲突

输入: intervals = [(5,8),(9,15)]
输出: true
解释:
这两个时间段不会冲突

解法:

一千个人心里有一千个哈姆雷特,那么一千个人就有一千种解法,我们拿到题之后,还是先看一下暴力解法。是不是你可以从intevals里面循环拿每一天去和后面的每一个来比较时间,看看会不会有冲突。但是很明显没有效率。其实这个例子是有迷惑性的,那就是因为这个题并没有说,时间是排好序的。既然这样,那我们来给它排个序,看看有没有什么帮助。好,现在假设已经排好序了,那后面怎么办呢。这是不是说明,后面的会议肯定是比前面的会议起始的要晚,那我们只要看看后面的会开始的时候,前面的会有没有结束就好了吧。那么转成代码就是这样的。

 public boolean canAttendMeetings(List<Interval> intervals) {
        // Write your code here
        if(intervals == null || intervals.size() == 0) {
            return true;
        }
        
        Collections.sort(intervals, new Comparator<Interval>(){
            
            public int compare(Interval meeting1, Interval meeting2) {
                return meeting1.start - meeting2.start;
            }
        });
        int end = intervals.get(0).end;
        for (int i = 1; i < intervals.size(); i++) {
            if (end > intervals.get(i).start) {
                return false;
            }
            end = intervals.get(i).end;
        }
        return true;
    }

我们明天来看一下这道题的升级版,好,今天就到这里喽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chris就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值