LeetCode刷题 - 基础算法小结

一.扫描线

什么是扫描线?

拿数飞机举例

思路一:暴力扫描

遍历每个时刻,检测每个时刻有多少个飞机

思路二:扫描线

不需要检测每一时刻,只需要检测起点或者终点的位置(交点变化的位置只有起点或者终点)

扫描线一般运用在图形上面,它和它的字面意思十分相似,就是一条线在整个图上扫来扫去,它一般被用来解决图形面积,周长等问题

总结

一般两种解法:使用 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,考察单调队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值