题目大意:
删除被覆盖区间
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 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] <= 10^5
- 对于所有的 i != j:intervals[i] != intervals[j]
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1288
解题思路分析:
我们需要先对数组进行排序,排序时,按照每个区间的开始位置进行升序排序。然后循环所有区间,当前区间的开始位置一定小于等于其右方所有区间的开始位置,接下来,只要在其右方找到结束位置小于等于当前结束位置的区间,该区间一定是被当前区间包围的,因此该区间可以被删除。为了避免重复删除,区间被删除后,将其结束区间更改为无限大即可。当接下来的循环中,遇到结束区间无限大时可以直接跳过。
实现代码:
public int removeCoveredIntervals(int[][] intervals) { // 按照区间开始位置进行升序排列 Arrays.sort(intervals,(x,y)->x[0]-y[0]); // 返回结果默认为区间总个数 int res=intervals.length; // 循环每个区间 for(int i=0;i<intervals.length;i++){ // 如果当前区间结束位置为100001(本题的最大值),跳过 if(intervals[i][1]==100001) continue; // 循环当前区间右方的所有区间 for(int j=i+1;j<intervals.length;j++){ // 如果当前区间结束位置大于等于该区间结束位置 if(intervals[i][1]>=intervals[j][1]){ // 删除该区间(结果减一) res--; // 为了避免重复删除,将该区间结束区间更新为一个最大值 intervals[j][1]=100001; } } } return res; }
本题解法执行时间为6ms。
Runtime: 6 ms, faster than 70.27% of Java online submissions for Remove Covered Intervals.
Memory Usage: 39.4 MB, less than 100.00% of Java online submissions for Remove Covered Intervals.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1288-remove-covered-intervals-解题思路分析/