leetcode 435. Non-overlapping Intervals | 435. 无重叠区间(单调栈)

我就是我 2022-09-04 02:55 264阅读 0赞

题目

https://leetcode.com/problems/non-overlapping-intervals/
在这里插入图片描述

题解

我一开始是没有 get 到这道题的精髓的。只是在想,用贪心法,当两个 (a,b) pair 重叠时,删除 b 较大的就可以了,直到遍历完整个数组。

开始时只是维护了双指针在数组中游荡,分别叫 slow 和 fast。如果删 slow,则 slow 回退;如果删 fast,则 fast 前进。后来发现,指针是不能够随意回退的,因为你不能保证前面一个位置的元素仍然存在,可能早已被删除了。

那么在 slow 回退的时候,怎么能找到前一个元素呢?一种方法是维护一个 alive 数组,这种方法太矬了。另一种方法就是维护一个栈。于是突然发现,这不就是一个单调栈吗。。只不过是数组中对角线的两个数字单调而已。

附上草稿记录无效思考过程。。

在这里插入图片描述

在这里插入图片描述

  1. class Solution {
  2. public int eraseOverlapIntervals(int[][] arr) {
  3. int L = arr.length;
  4. Arrays.sort(arr, (o1, o2) -> {
  5. if (o1[0] != o2[0]) return o1[0] - o2[0];
  6. else return o1[1] - o2[1];
  7. });
  8. // 居然是个单调栈???
  9. Stack<int[]> stack = new Stack<>();
  10. int i = 0;
  11. while (true) {
  12. while (i < L && !stack.isEmpty() && stack.peek()[1] > arr[i][0]) {
  13. if (stack.peek()[1] > arr[i][1]) { // 删slow
  14. stack.pop();
  15. } else { // 删fast
  16. i++;
  17. }
  18. }
  19. if (i >= L) break;
  20. stack.push(arr[i++]);
  21. }
  22. return L - stack.size();
  23. }
  24. }

发表评论

表情:
评论列表 (有 0 条评论,264人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode 435.重叠区间(java 贪心)

    d先根据各区间尾节点进行从小到大排序,然后依次判断下一个区间的开始节点是否大于上一个区间的结束节点,若大于,可留住,若是小于,则发生重叠,删去。这样就能保证尾节点小的留住,为后

    相关 leetcode435重叠空间

    给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 \[1,2\] 和 \[2,3\] 的边界相互