一.扫描线
什么是扫描线?
拿数飞机举例
思路一:暴力扫描
遍历每个时刻,检测每个时刻有多少个飞机
思路二:扫描线
不需要检测每一时刻,只需要检测起点或者终点的位置(交点变化的位置只有起点或者终点)
扫描线一般运用在图形上面,它和它的字面意思十分相似,就是一条线在整个图上扫来扫去,它一般被用来解决图形面积,周长等问题
总结
一般两种解法:使用 pq(heap) 或者将 start/end 分开进行扫描线
考点:sort常用comparator的写法,判断interval merge的边界条件
Arrays.sort(intervals,(a,b) -> a[0] - b[0]);
Arrays.sort(intervals,new Comparator<Interval>() {
@override
public int compare(Interval a,Interval b) {
return a.start - b.start;
}
}
PriorityQueue<int[]> heap = new PriorityQueue<>((a,b) -> a[1] - b[1]);
PriorityQueue<Interval> heap = new PriorityQueue<Interval> (intervals.length,new Comparator<Interval>() {
@override
public int compare(Interval a,Interval b) {
return a.end - b.end;
}
}
二.滑动窗口
什么是滑动窗口?
滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度
如何识别滑动窗口?
1.连续的元素,比如string,subarray,LinkedList
2.min,max,longest,shortest,key word
滑动窗口基本类型
1.Easy,size fixed
窗口长度确定,比如max sum of size = k
2.Median,size可变,单限制条件
比如找到subarray sum比目标值大一点点
3.Median,size可变,双限制条件
比如longest substring with distinct character
4.Hard,size fixed,单限制条件
比如sliding window maximum,考察单调队列