A-B 数对
题目描述
给出一串正整数数列以及一个正整数 C C C,要求计算出所有满足 A − B = C A - B = C A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个正整数 N , C N,C N,C。
第二行, N N N 个正整数,作为要求处理的那串数。
输出格式
一行,表示该串正整数中包含的满足 A − B = C A - B = C A−B=C 的数对的个数。
思路一
双指针算法维护
从左至右遍历, r2节点为目标数据段的最左端,r1节点为目标数据段的最右端
sort(a, a + n);
int l = 0, r1 = 0, r2 = 0;
int ans = 0;
for (; l < n; l++) {
while (r1 < n && a[r1] - a[l] <= c)r1++;
while (r2 < n && a[r2] - a[l] < c)r2++;
if (a[r1-1] - a[l] == c && a[r2] - a[l] == c)
ans += r1 - r2;
}
思路二
二分,本质思想和思路一相同
sort(a, a + n);
for (int i = 0; i < n; i++)
ans += upper_bound(a + i, a + n, a[i] + c) - lower_bound(a + i, a + n, a[i] + c);
lower_bound( begin,end,num)
函数lower_bound作用 : 找到给定数组范围中二分查找第一个可插入的位置,也就是>=num
而upper_bound是二分找到最后一个可插入的位置,即>num