一、源代码
m,a,b = map(int,input().split())
m1 = [] #存第一个的index
m1_a = [] #存第一个的value
m2 = [] #存第二个的index
m2_a = [] #存第二个的value
for i in range(a):
a_m1,b_m1 = map(int,input().split())
m1.append(a_m1)
m1_a.append(b_m1)
for i in range(b):
a_m2,b_m2 = map(int,input().split())
m2.append(a_m2)
m2_a.append(b_m2)
res = []
temp_a = 0
temp_b = 0
#类双指针找第一个和第二个的相同index
while (temp_a < a) and (temp_b < b):
if m1[temp_a] == m2[temp_b]:
res.append(temp_a)
res.append(temp_b)
temp_a += 1
temp_b += 1
elif m1[temp_a] < m2[temp_b]:
temp_a += 1
elif m1[temp_a] > m2[temp_b]:
temp_b += 1
ans = 0
for i in range(0,len(res),2):
ans += m1_a[res[i]]*m2_a[res[i+1]]
print(ans)
二、思考历程
大致得分情况如上图,接下来说说我的思路变化。
1.无优化,存粹的暴力。
一开始完全按照题目所给的条件,创建了两个长为n的列表,然后分别读取a行和b行的数,最后遍历n行来求a和b中的非零对。时间复杂度为(n),空间复杂度为(n)。不出意外的超时了。
2.用字典,一一对应。
因为行是不可能重复的,于是我用字典来存index和value,来节省空间开销。其中找非零对我用了嵌套循环。时间复杂度为(a*b),空间复杂度为(max(a,b))。空间复杂度下来了,然而时间复杂度更高了。
3.福至心灵类双指针
一开始想到的双指针是在刚刚字典的基础上用的,结果它说没有这个key,于是我才想到现在的办法。运用类双指针在两个列表里面找相等的值,于是时间复杂度就只有(max(a,b)),空间复杂度也只有(max(a,b))。
总结
多刷题还是有点用的,因为一开始的满分是白嫖的,后来经过这段时间(1个月)的学习,也可以自己写出来了,开心。