prof = sorted([int(input()) for x in range(int(input()))])
student = sorted([int(input()) for x in range(int(input()))])
prof_dates = len(prof)
stud_dates = len(student)
amount = 0
prof_index = 0
stud_index = 0
while stud_index < stud_dates and prof_index < prof_dates:
if student[stud_index] == prof[prof_index]:
amount += 1
stud_index += 1
elif student[stud_index] > prof[prof_index]:
prof_index += 1
elif student[stud_index] < prof[prof_index]:
stud_index += 1
print(amount)
但是代码产生了超出时间限制的错误。之前我曾尝试对学生的每个项目使用in
,但它产生了TLE,我相信这是因为in
语句是O(n)
。所以,我编写了这段代码,其所需的步骤大致等于两个列表的长度之和。但这也产生了一个TLE。那么,我应该在我的代码中做出哪些更改。是否有一些特定的部分有很高的时间费用?
感谢。
答案 0 :(得分:3)
您正在使用排序+合并。这需要O(NlogN + MlogM + N + M)
时间复杂度。
但您可以将教授数据放在set
中,检查每个学生年份值(来自未排序的列表)并获得O(M + N)
复杂性(平均)。
请注意,此方法消除了学生列表排序的长时间操作。
另外:python有内置集。对于没有此类规定的语言,教授的列表已经排序,因此您可以每年使用二进制搜索。复杂性为O(NlogM)
。
答案 1 :(得分:1)
由于问题基本上是找到两组整数的交集,所以当假设在O(M + N)
O(1)
中的问题
prof = set([int(input()) for x in range(int(input()))])
student = set([int(input()) for x in range(int(input()))])
equals_dates = len(prof.intersection(student))