描述
Given a list of intervals, remove all intervals that are covered by another interval in the list.
Interval [a,b) is covered by interval [c,d) if and only if c <= a and b <= d.
After doing so, return the number of remaining intervals.
Example 1:
Input: intervals = [[1,4],[3,6],[2,8]]
Output: 2
Explanation: Interval [3,6] is covered by [2,8], therefore it is removed.
Example 2:
Input: intervals = [[1,4],[2,3]]
Output: 1
Example 3:
Input: intervals = [[0,10],[5,12]]
Output: 2
Example 4:
Input: intervals = [[3,10],[4,10],[5,11]]
Output: 2
Example 5:
Input: intervals = [[1,2],[1,4],[3,4]]
Output: 1
Note:
1 <= intervals.length <= 1000
intervals[i].length == 2
0 <= intervals[i][0] < intervals[i][1] <= 10^5
All the intervals are unique.
解析
根据题意,只是相当于将大的 interval 把在其范围内的小的 interval 都吞并了,最后对剩下的 interval 进行计数。首先要对 intervals 按照第一个元素(即每个 interval 的左边界)进行升序排序,如果第一个元素相等则按照第二个元素(即每个 interval 的右边界)进行升序排列,然后遍历所有 intervals ,然后对下面三种情况进行判断:
- 如果 intervals[i] 的左边界和 intervals[i-1] 的左边界相等,说明 intervals[i] 包含 intervals[i-1] ,可以将 intervals[i-1] 去掉
- 如果 intervals[i] 的右边界小于等于 intervals[i-1] 的右边界,说明 intervals[i-1] 包含 intervals[i] ,可以将 intervals[i] 去掉
- 如果 intervals[i] 的右边界大于 intervals[i-1] 的右边界,说明 intervals[i-1] 和 intervals[i] 交叉,不管。
最后对 intervals 剩下的元素进行计数即可。
解答
class Solution(object):
def removeCoveredIntervals(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: int
"""
intervals.sort()
n = len(intervals)
res = 1
i=1
while i<n:
if intervals[i][0] == intervals[i-1][0]:
intervals.remove(intervals[i-1])
n-=1
elif intervals[i][1] <= intervals[i-1][1]:
intervals.remove(intervals[i])
n-=1
elif intervals[i][1] > intervals[i-1][1]:
res+=1
i+=1
return res
运行结果
Runtime: 80 ms, faster than 46.02% of Python online submissions for Remove Covered Intervals.
Memory Usage: 14.1 MB, less than 15.04% of Python online submissions for Remove Covered Intervals.
原题链接:leetcode.com/problems/re…
您的支持是我最大的动力