题目:
给出一串数以及一个数字 CC,要求计算出所有 A - B = CA−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
inout:
4 1
1 1 2 3
output:
3
我们先把数列排序,这样就可以双指针做了。
l和r 代表左指针和右指针
如果s[r] - s[l] > k 就移动左指针
如果s[r] - s[l] < k 就移动右指针
如果s[r] - s[l] == k 说明找到两个目标数
考虑:
若k =1
如:1 1 2 2 2这样的数列,我们需要在找到第一个1和第一个2以后不断移动右指针,找到最后一个2,再累加,且判断左指针处是否有相邻一样的。看代码
#include<bits/stdc++.h>
using namespace std;
int s[200006];
int main()
{
int n, k;
long long ans = 0; //记录结果
scanf("%d%d",&n,&k);
for (int i = 1; i <= n; i++) {
scanf("%d",&s[i]);
}
sort(s+1,s+n+1);
int r = 1, l = 1, tim = 1; //分别代表右指针,左指针,重复元素的个数
while (l <= r && r <= n){
if(s[r] - s[l] < k) r++;
else if(s[r] - s[l] == k){ //因为对于类似11222这样的需要以下处理
if(s[r] == s[r+1]) tim++,r++; //不断移动右指针,记录有多少个2
else { // 如果没有相等的,就进行计算结果
if(s[l] == s[l+1]) ans+= tim,l++; // 如果做指针也有相同的(类似11这样),tim就不归1
else ans+= tim,tim = 1,l++; //对tim归一
}
}
else l++;
}
printf("%lld\n",ans);
return 0;
}