数组类——区间问题
序号 | 题目 | 难度 | 代码 |
---|---|---|---|
56 | Merge Intervals | Medium | python、java、c++ |
57 | Insert Interval | Hard | python、java、c++ |
252 | Meeting Rooms | easy | python、java、c++ |
253 | Meeting Rooms II | medium | python、java、c++ |
352 | Data Stream as Disjoint Intervals | hard | python、java、c++ |
T56-Merge Intervals
Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]] Output: [[1,6],[8,10],[15,18]] Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]] Output: [[1,5]] Explanation: Intervals [1,4] and [4,5] are considered overlapping.
# Definition for an interval.
# class Interval:
# def __init__(self, s=0, e=0):
# self.start = s
# self.end = e
class Solution:
def merge(self, intervals: List[Interval]) -> List[Interval]:
ans = []
for intv in sorted(intervals, key=lambda x :x.start):
if ans and ans[-1].end >= intv.start:
ans[-1].end = max(ans[-1].end,intv.end)
else:
ans.append(intv)
return ans
T57-Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Input: intervals = [[1,3],[6,9]], newInterval = [2,5] Output: [[1,5],[6,9]]
Example 2:
Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8] Output: [[1,2],[3,10],[12,16]] Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].
# Definition for an interval.
# class Interval:
# def __init__(self, s=0, e=0):
# self.start = s
# self.end = e
class Solution:
def insert(self, intervals: List[Interval], newInterval: Interval) -> List[Interval]:
s, e = newInterval.start, newInterval.end
left = list(filter(lambda x: x.end < newInterval.start, intervals))
right = list(filter(lambda x: x.start > newInterval.end, intervals))
if left + right != intervals:
s = min(intervals[len(left)].start, s)
e = max(intervals[~len(right)].end, e)
return left + [Interval(s, e)] + right
T252-Meeting Rooms
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), determine if a person could attend all meetings.
Example :
For example, Given [[0, 30],[5, 10],[15, 20]], return false.
# Definition for an interval.
# class Interval(object):
# def __init__(self, s=0, e=0):
# self.start = s
# self.end = e
class Solution(object):
def canAttendMeetings(self, intervals):
"""
:type intervals: List[Interval]
:rtype: bool
"""
intervals = sorted(intervals, key=lambda x: x.start)
for i in range(1, len(intervals)):
if intervals[i].start < intervals[i - 1].end:
return False
return True
T253-Meeting Rooms II
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), find the minimum number of conference rooms required.
Example :
For example, Given [[0, 30],[5, 10],[15, 20]], return 2.
class Solution(object):
def minMeetingRooms(self, intervals):
"""
:type intervals: List[Interval]
:rtype: int
"""
meetings = []
for i in intervals:
meetings.append((i.start, 1))
meetings.append((i.end, 0))
meetings.sort()
ans = 0
count = 0
for meeting in meetings:
if meeting[1] == 1:
count += 1
else:
count -= 1
ans = max(ans, count)
return ans
T352-Data Stream as Disjoint Intervals
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen so far as a list of disjoint intervals.
For example, suppose the integers from the data stream are 1, 3, 7, 2, 6, ..., then the summary will be:
[1, 1] [1, 1], [3, 3] [1, 1], [3, 3], [7, 7] [1, 3], [7, 7] [1, 3], [6, 7]
Follow up:
What if there are lots of merges and the number of disjoint intervals are small compared to the data stream's size?