我需要编写一个包含带有两个数字的元组的列表的代码,例如[(1、2),(5、8),(1、3),(1、1),(3、6) ]。元组的第一个数字是事件开始的日期,第二个数字是事件结束的日期。此代码应返回同时发生的最大事件数,时间复杂度应为O(n)。我有问题的是时间复杂度。这是我可以编写的最省时的代码:
def divide_to_groups(calendar):
if len(calendar) == 0:
return 0
def group_num(j, groups): # takes index of group and list groups, returns last number of last tuple
if isinstance(groups[j][-1], int):
return groups[j][-1]
else:
return groups[j][-1][1]
calendar = list(sorted(calendar))
groups = [[calendar[0]]]
for i in range(1, len(calendar)):
for j in range(len(groups)):
if group_num(j, groups) < calendar[i][0]: # if previous group has time when current event begins
groups[j].append(calendar[i])
break
elif j+1 == len(groups):
groups.append([calendar[i]])
return len(groups)
# Tests
def test_default():
calendars = [
[ ],
[ (1, 2), (3, 3), (500, 800), (50, 56) ],
[ (1, 2), (5, 8), (1, 3), (1, 1), (3, 6) ],
[ (1, 1), (1, 50), (25, 75), (60, 100), (2, 3) ]
]
answers = [ 0, 1, 3, 2 ]
for i in range(len(calendars)):
result = divide_to_groups(calendars[i])
if result == answers[i]:
print("[", i, "] OK.", sep="")
else:
print("[", i, "] Not OK. Expected ", answers[i], " but got ", result, ".", sep="")
if __name__ == '__main__':
test_default()
答案 0 :(得分:0)
如果N是您的活动数量。
在线性时间O(N)中,您可以在日历矩阵中用一个(或X标记)填充范围,其中列将是天,并对每列求和以查看一天中有多少事件D。
1 2 .... 31
event1 x x x .....
event2 x x x ...
event3 x x .....
...
-----------------------
SUM 1 4 5 .....
然后计算最大索引i
,其中SUM(D=i)
最大。
您甚至可以直接编写sums(d)
列表,而无需存储在中间矩阵中,只需使用范围结构即可。
要考虑的另一个问题是在该列中编码一年中的日期。日期库通常会为您提供您的日期是一年中的哪一天(1 <= d <= 366)。
祝你好运。