Facebook面试题 meeting rooms 求同时最多meeting room的时间
2017-01-07 15:28
447 查看
给出会议开始和结束时间,求meeting room interval最多的时间点。返回任意一个时间即可。
显然本题可以方便地使用扫描线算法解决。在扫描线段的同时保存一个时间。最终返回最多interval对应的时间即可。整个算法可以描述如下:
将meeting开始和结束的时间点分别存在list中。
对整个list按时间排序。相同的时间结束应该优先于开始。
遍历排序好的list,对同时存在的线段进行计数并记录时间。
算法的Java实现如下:
显然本题可以方便地使用扫描线算法解决。在扫描线段的同时保存一个时间。最终返回最多interval对应的时间即可。整个算法可以描述如下:
将meeting开始和结束的时间点分别存在list中。
对整个list按时间排序。相同的时间结束应该优先于开始。
遍历排序好的list,对同时存在的线段进行计数并记录时间。
O(nlogn)时间,
O(n)空间。因为我们最多对
2n个点进行了存储,排序和遍历。
算法的Java实现如下:
/** * Definition of Interval: * public class Interval { * int start, end; * Interval(int start, int end) { * this.start = start; * this.end = end; * } * } */ class Point { int time; int flag; public Point(int time, int flag) { this.time = time; //end flag = 0, start flag = 1 this.flag = flag; } public static Comparator<Point> PointComparator = new Comparator<Point>() { @Override public int compare(Point p1, Point p2) { if (p1.time == p2.time) { return p1.flag - p2.flag; // end has priority over start } return p1.time - p2.time; } }; } class Solution { public int timeWithMostIntervals(List<Interval> meetings) { if (meetings == null || meetings.size() == 0) { return 0; } List<Point> lines = new ArrayList<meetings.size() * 2>(); for (Interval i : meetings) { lines.add(i.start, 1); lines.add(i.end, 0); } Collections.sort(lines, Point.PointComparator); int ret = 0; int max = Integer.MIN_VALUE; int count = 0; for (int i = 0; i < lines.size(); i++) { if (lines.get(i).flag == 0) { count--; } else { count++; } if (count > max) { max = count; ret = lines.get(i).time; } } return ret; } }
相关文章推荐
- C/C+面试题一:找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2)
- 程序员面试题精选100题(33)-在O(1)时间删除链表结点
- 【面试题】找出字符串中连续出现次数最多的子串
- Facebook面试题 find the peek or valley index in an array
- 面试题(实现一个栈,要求实现Push、Pop、Min的时间复杂度为O(1))
- O(n)时间解决的面试题:Container with most water
- [各种面试题] 买卖股票最多K次
- 【剑指offer】5.2时间效率——面试题29:数组中出现次数超过一半的数字
- 做的一个面试题5分钟刷新当前时间的总结
- 剑指offer 面试题13 在O(1)时间删除给定结点
- 统计同时购买的商品和购买时间
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 面试题-深度克隆对象,显示时间(2014.4.17)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 372. 在O(1)时间复杂度删除链表节点 (delete-node-in-the-middle-of-singly-linked-list)(c++)----lintcode面试题之链表
- 面试题-abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
- 同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,1K的方波
- 《剑指Offer》面试题:在 O(1)时间删除链表结点
- Careercup - Facebook面试题 - 6685828805820416
- Linux下同时变更时间和日期的方法