因此,为了解释我的代码:我试图使用一个贪婪的迭代活动选择器算法来解决这个活动选择问题。我希望通过在一个会议列表中添加一个会议(一个会议是一个由两个元素组成的列表,比如[0, 1],0是开始时间,1是结束时间)到一个集合,如果它符合标准并返回该集合的长度,就可以得到可能的最大活动计数。但是我得到了一个TypeError on meetings_set.add(sorted_meetings[i]),我认为我知道原因(列表不是不变的),但我不知道如何编写代码。我密切关注活动选择问题的最优解的例子来创建这个算法。
def answer(meetings):
sorted_meetings = sorted(meetings, key = lambda x: int(x[1]))
meetings_set = set((sorted_meetings[1]))
k = 1
meetings_len = len(meetings)
for i in range(2, meetings_len):
if sorted_meetings[i][0] >= sorted_meetings[k][1]:
meetings_set.add(sorted_meetings[i])
k = i
return len(meetings_set)发布于 2016-03-28 04:45:00
每个“会议”都是一个由两个整数组成的列表。集合只能包含可访问的对象,而列表则不包含。一个可能的解决方案是,在将列表添加到您的“meetings_set”之前,将其设置为一个不可变的元组。
meetings_set.add(tuple(sorted_meetings[i]))此外,您的代码将第一次会议的开始和结束时间添加为meetings_set的单独元素。
set构造函数将使初始集包含给定迭代的每个元素。set((sorted_meetings[1]))只是忽略了额外的一组括号,并将一个列表传递给构造函数,这就是错误的原因。您可以通过以下方式绕过这一问题:
meetings_set = set()
meetings_set.add(tuple(sorted_meetings[1]))撇开:
我相信你所有的指数都差一个。您当前的代码没有考虑第一个元素(我不确定这是否有意)。下面是带有调整索引的示例代码:
def answer(meetings):
sorted_meetings = sorted(meetings, key = lambda x: int(x[1]))
meetings_set = set()
meetings_set.add(tuple(sorted_meetings[0]))
k = 0
meetings_len = len(meetings)
for i in range(1, meetings_len):
if sorted_meetings[i][0] >= sorted_meetings[k][1]:
meetings_set.add(tuple(sorted_meetings[i]))
k = i
return len(meetings_set)发布于 2016-03-28 04:54:31
列表是不可理解的,因此不能用作set元素。元组是可选的,所以在将它们添加到集合之前,先将列表转换为元组。例如,若要向集合添加会议,请使用:
meetings_set.add(tuple(sorted_meetings[i]))https://stackoverflow.com/questions/36256067
复制相似问题