13. Interval与扫描线
区间类的题目,很多可以用Greedy来做
Comparator的两种实现方法
一种是先Implements一个类,然后Arrays.sort(intervals, new newComparator);
public class newComparator implements Comparator<Object>{ public int compare(Object a, Object b) { Interval aa = (Interval) a; Interval bb = (Interval) b; return aa.start - bb.start; } }另一种是写在Arrays.sort()里面,实践证明这种更快
Arrays.sort(intervals, new Comparator<Interval>(){ //compare by start time public int compare(Interval a, Interval b){ return a.start - b.start; } });
这题最简单的方法就是sort by start time,then check if(intervals[i].start < intervals[i-1].end) return false;
Meeting Rooms II
给定一堆meetings, 要求返回需要最少room的数量
sort intervals by start time
minHeap compare with end time
for loop intervals, if cur.startTime < minHeap.peek().endTime, then push cur to heap, cnt++ ->NlogK
res = max(cnt)
还有一种扫描线解法
Merge Interval
sort intervals by start time
iterate each interval, compare cur.startTime with prev.EndTime
if cur.startTime < end, then end = Math.max(end, cur.endTime)
else push [begin, end] to res
这题最简单的做法是把newInterval插到intervals里面,然后再调用上面的merge Interval的方法
但是鉴于此题有个前提Given a set of non-overlapping intervals,所以用merge interval的话可能会浪费很多时间
所以可以把intervals分成三部分,对于整个interval都在newinterval左边或者右边的我们可以直接add to res
所以只需要处理有overlapping的情况,这里有个技巧就是用while loop实现之前的三部分分类,改变newInterval的start和end值,直到当前的interval完全在newInterval的右边,没有任何交集
然后add newInterval, 再add the rest into res
这题对于space可以有优化,in place solultion,但是因为list.remove(i)是O(N)操作,所以时间上会有牺牲
这题从算法上没啥好说的
就是注意corner case就好,比如[0,1] [7]
还有解体要有模块化的思路
Missing Ranges(好题)
这题比summary ranges稍难,重在理清思路
有个简单的方法是用lower做runner
每次遍历num时,设upperBelow = num - 1,然后比较upperBelow和 lower的关系
然后记得update lower = num + 1
这样写的话题有个test case过不去[2147483647], lower = 0, upper = 2147483647。原因在于lower = num + 1之后就int overflow了,所以必须cast to long type
Skyline Problem
Last updated
Was this helpful?