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]

  • 还有解体要有模块化的思路

  • 这题比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?