无重叠区间

怼烎@ 2024-04-06 13:13 165阅读 0赞

435. 无重叠区间

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。

示例 1:

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

提示:
  • 1 < = i n t e r v a l s . l e n g t h < = 1 0 5 1 <= intervals.length <= 10^5 1<=intervals.length<=105
  • i n t e r v a l s [ i ] . l e n g t h = = 2 intervals[i].length == 2 intervals[i].length==2
  • − 5 ∗ 1 0 4 < = s t a r t i < e n d i < = 5 ∗ 1 0 4 -5 * 10^4 <= starti < endi <= 5 * 10^4 −5∗104<=starti<endi<=5∗104
思路:

贪心算法:
先计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数。

在每次选择中,区间的结尾最为重要,选择的区间结尾越小,留给后面的区间的空间越大,那么后面能够选择的区间个数也就越大。

按区间的结尾进行排序,每次选择结尾最小,并且和前一个区间不重叠的区间。

代码:
  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. public class no_overlap {
  4. public static void main(String[] args) {
  5. // TODO 自动生成的方法存根
  6. int [][] intervals = {
  7. {
  8. 1,2}, {
  9. 1,2}, {
  10. 1,2} };
  11. int n = eraseOverlapIntervals(intervals);
  12. System.out.println(n);
  13. }
  14. public static int eraseOverlapIntervals(int[][] intervals) {
  15. if(intervals.length == 0)
  16. return 0;
  17. Arrays.sort(intervals, new Comparator<int[]>() {
  18. public int compare(int[] interval1, int [] interval2) {
  19. return interval1[1] - interval2[1];
  20. }
  21. });
  22. int n = intervals.length;
  23. int cnt = 1;
  24. int end = intervals[0][1];
  25. for(int i=1; i<n; i++) {
  26. if(intervals[i][0] < end) {
  27. continue;
  28. }
  29. end = intervals[i][1];
  30. cnt++;
  31. }
  32. return intervals.length - cnt;
  33. }
  34. }
复杂度分析
  • 时间复杂度:O(nlogn),其中 n 是区间的数量。我们需要 O(nlogn) 的时间对所有的区间按照右端点进行升序排序,并且需要 O(n) 的时间进行遍历。由于前者在渐进意义下大于后者,因此总时间复杂度为 O(nlogn)。
  • 空间复杂度:O(logn),即为排序需要使用的栈空间。

来源:力扣(LeetCode)

注:仅供学习参考。

发表评论

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

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

相关阅读

    相关 重叠区间

    435. 无重叠区间 > 给定一个区间的集合 intervals ,其中 intervals\[i\] = \[starti, endi\] 。返回 需要移除区间的最小数

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

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

    相关 重叠区间

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