给定一系列的会议时间间隔,包括起始和结束时间[[s1,e1],[s2,e2],…(si < ei),确定一个人是否可以参加所有会议。
第一次作答:
"""
Definition of Interval.
class Interval(object):
def __init__(self, start, end):
self.start = start
self.end = end
"""
class Solution:
"""
@param intervals: an array of meeting time intervals
@return: if a person could attend all meetings
"""
def canAttendMeetings(self, intervals):
# Write your code here
if intervals == None or len(intervals) == 0:
return True
def intervals_start(intervals):
return intervals.start
intervals.sort(key = intervals_start)
for i in range(len(intervals) - 1):
if intervals[i + 1].start < intervals[i].end:
return False
return True
先对列表排序,再把相邻的元素做对比。例如第一个,若e1 > s2,则返回false。所有相邻的数据对比完后,没有返回false,则返回true
查看九章算法给的答案:
https://www.jiuzhang.com/solution/meeting-rooms/#tag-other-lang-python
class Solution(object):
def canAttendMeetings(self, intervals):
"""
:type intervals: List[Interval]
:rtype: bool
"""
if len(intervals) == 0:
return True
intervals = sorted(intervals, key = lambda x: x.start)
end = intervals[0].end
for i in range(1, len(intervals)):
if end > intervals[i].start:
return False
end = intervals[i].end
return True
发现了对对多关键字的排序。使用lambda表达式。
更简洁的答案:
class Solution:
def canAttendMeetings(self, intervals) -> bool:
end_time = -1
for interval in sorted(intervals, key = lambda interval: interval.start):
if interval.start < end_time:
return False
end_time = interval.end
return True
将循环与排序放到一起,并且用一个变量记录结束时间,然后循环开始时间。