春招冲刺Day6[高频算法题] -- 安排会议室(贪心,区间问题)

1 .会议室

这两道题来自Leetcode 252 和Leetcode253 ,需要会员才能做!!

1.1 会议室I

在这里插入图片描述
思路很简单,对会议按照开始时间进行排序,如果后一个会议的开始时间小于前一个会议的结束时间,则表示这两个会议冲突,不能都参加

  public static boolean scheduleMeetingRoom1(int[][] meetings){
        if(meetings == null || meetings.length == 0) return false;
        Arrays.sort(meetings, (a,b) -> a[0] - b[0]);
        for(int i = 1; i < meetings.length; i++){
            if(meetings[i][0] < meetings[i-1][1]) return false;
        }
        return true;
    }

1.2 会议室II

在这里插入图片描述
解法1: 排序 + 小顶堆 ,时间复杂度N*log(N),空间复杂度O(n)

贪心思想

  • 先把会议室按照开始时间进行排序,用堆存放正在进行的会议的结束时间
  • 然后遍历每一个会议,把会议的开始时间与正在进行的会议的最早结束时间进行比较,
  • 如果当前会议的开始时间大于等于进行中的会议的最早结束时间,那么就可以复用那个会议室,移除之前堆中最早结束的会议,把当前会议的结束时间放到堆中
  • 否则新开一个会议室,
  • 遍历完所有会议,堆的大小就是需要的会议室

在这里插入图片描述

 public static int scheduleMeetingRoom2(int[][] meetings){
        if(meetings == null || meetings.length == 0) return 0;

        Arrays.sort(meetings, (a,b) -> a[0] - b[0]);//N*log(N)

        //创建一个最小堆,存放每一个会议的结束时间
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();//空间复杂度O(N)

        priorityQueue.add(meetings[0][1]);
        for(int i = 1; i < meetings.length; i++){ //N*log(N)
            if(meetings[i][0] >= priorityQueue.peek()) priorityQueue.poll();
            priorityQueue.add(meetings[i][1]);
        }
        return priorityQueue.size();
    }

解法2: 既然堆的作用是对会议的结束时间进行排序,那我们可以使用数组来代替堆

  • 分别对开始时间和结束时间进行排序,遍历开始时间数组
  • 如果开始时间大于等于结束时间数组中最小值,代表可以复用,endIdx++,beginIdx++
  • 否则,代表不能复用,所需要的会议室room++,beginIdx++
    在这里插入图片描述
 public static int scheduleMeetingRoom3(int[][] meetings){
        //贪心思想
        //和解法2类似,只是把堆换成了数组,用数组来保存结束时间,并对数组排序可以达到和使用堆一样的效果
        if(meetings == null || meetings.length == 0) return 0;
        int [] begins = new int[meetings.length];
        int [] ends   = new int[meetings.length];
        for (int i = 0; i < meetings.length; i++) {
            begins[i] = meetings[i][0];
            ends[i]   = meetings[i][1];
        }
        Arrays.sort(begins);
        Arrays.sort(ends);

        int eindex = 0;
        int room = 0;
        for (int begin : begins) {
            if(begin >= ends[eindex]) eindex++;
            else room++;
        }
        return room;
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2023年3月11日,美团春季招聘笔试中共包含五道编程目。以下是对每道目的简要说明: 1. 目一:这道目要求解决一个数字统计的问题。可能涉及到的知识点包括数据结构、循环和条件判断等。解决问题的思路可能是使用字典等数据结构来保存统计结果,并使用循环逐个读取输入数据并进行统计。 2. 目二:这道目可能是一个字符串处理的问题。需要使用字符串的方法进行操作,如提取、拼接、查找和替换等。可能的解决思路包括使用正则表达式、切片和遍历等。 3. 目三:这道目可能涉及到算法和数据结构的知识。可能是一道涉及到数组、链表、树等数据结构的问题。解决思路可能包括遍历、递归、搜索和排序等。 4. 目四:这道目可能是一个动态规划的问题。需要根据给定的条件和规则,通过动态规划的方式求解问题。解决思路包括定义状态和转移方程,使用递推或记忆化搜索进行求解。 5. 目五:这道目可能是一个图论或网络问题。需要根据给定的图或网络结构,解决一个相关的问题。可能涉及到广度优先搜索、深度优先搜索、最短路径等知识。解决思路可能包括使用图或网络的相关算法进行求解。 以上只是对这五道编程目的一些可能情况进行的简要描述,具体的目内容可能会有所不同。希望这些信息能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值