双指针的一道题目,按照思路,先根据描述,用朴素暴力枚举的做法来跑一遍,这时的时间复杂度是O(N*M)的。接着发现能过13/16,想办法优化。其实不用跑也就知道会超时, nm是1e10,大于1e8了。发现符合双指针,因为,i,j有一个关系,q[i]+q[j]==x。而且两个序列还都是递增的,只要i提高了,j就应该要减少,否则两者之和会变大。这里你就发现了双指针的原则了。为什么不能是i和j从0开始一起增大呢?即满足j<m and q[i]+q[j]<x时,j自加一。为什么不能这样呢?是两个人的关系使然。因为你会发现,如果这样做,当i增大到一定程度时,j只会增大或者不变,就不能找到准确的x了。那么正确的思路是什么,我们该怎么思考能够下次避免继续走入这种误区呢?
我总结的方法是,以i为中心,我们始终是去考虑i作为主体去递增,然后想象这个关系已经成立时,如果还去增加i,根据关系知道i增大时,j会减少。于是这就确立了我们的check函数的写法,i增加,当j>0且q[i]+q[j]>x时,j-=1。这样无论i加到任何程度,都能找到合适的j来匹配。
暴力做法
n,m,x=map(int,input().split())
A=list(map(int,input().split()))
B=list(map(int,input().split()))
def cal():
for i in range(n):
for j in range(m):
if A[i]+B[j]==x:
print(i,j)
return
cal()
双针:
n,m,x=map(int,input().split())
A=list(map(int,input().split()))
B=list(map(int,input().split()))
j=m-1
for i in range(n):
while j>0 and A[i]+B[j]>x:
j-=1
if A[i]+B[j]==x:
print(i,j)
break