LeetCode_区间问题_中等_1288.删除被覆盖区间

x33g5p2x  于2022-04-16 转载在 其他  
字(1.1k)|赞(0)|评价(0)|浏览(293)

1.题目

给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。

只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。

在完成所有删除操作后,请你返回列表中剩余区间的数目

示例:
输入:intervals = [[1,4],[3,6],[2,8]]
输出:2
解释:区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。

提示:​​​​​​
1 <= intervals.length <= 1000
0 <= intervals[i][0] < intervals[i][1] <= 105
对于所有的 i != j: intervals[i] != intervals[j]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-covered-intervals

2.思路

(1)排序
思路参考一文秒杀所有区间相关问题

3.代码实现(Java)

  1. //思路1————排序
  2. public int removeCoveredIntervals(int[][] intervals) {
  3. //res保存被覆盖的区间数,初始值为0
  4. int res = 0;
  5. //按照区间的左端点对所有区间进行升序排序
  6. Arrays.sort(intervals, (a, b)-> {
  7. if (a[0] == b[0]) {
  8. return b[1] - a[1];
  9. } else {
  10. //如果Comparator接收的返回值为正数,就会交换 a 和 b
  11. return a[0] - b[0];
  12. }
  13. });
  14. //记录合并区间的左端点和右端点
  15. int left = intervals[0][0];
  16. int right = intervals[0][1];
  17. for (int i = 1; i < intervals.length; i++) {
  18. int[] curInter = intervals[i];
  19. //找到被覆盖的区间
  20. if (left <= curInter[0] && curInter[1] <= right) {
  21. res++;
  22. }
  23. //找到相交区间,更新右端点
  24. if (left <= curInter[0] && right <= curInter[1]) {
  25. right = curInter[1];
  26. }
  27. //找到的区间无交集,更新左右端点
  28. if (right <= curInter[0]) {
  29. left = curInter[0];
  30. right = curInter[1];
  31. }
  32. }
  33. return intervals.length - res;
  34. }

创作挑战赛

新人创作奖励来咯,坚持创作打卡瓜分现金大奖

相关文章