ccfcsp202006-2 稀疏向量满分(python)

一、源代码

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个月)的学习,也可以自己写出来了,开心。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值