题目描述
给出一串正整数数列以及一个正整数 C,要求计算出所有满足 A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个正整数 N,C。
第二行,N 个正整数,作为要求处理的那串数。
输出格式
一行,表示该串正整数中包含的满足 A−B=C 的数对的个数。
输入输出样例
输入
4 1 1 1 2 3
输出
3
说明/提示
对于 75%的数据,1≤2000
对于 100% 的数据,1≤2×10^5,0≤ai<2^30,1≤C<2^30。
其实很多解法,哈希、双指针……但有跟简单易懂的解法,记录出现次数,将A-B=C转换为A-C=B,就只需要记录a[i]的出现次数了。
AC代码:
//将A-B=C转换为A-C=B,记录A出现次数,输出A-C的出现次数
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
long long n, c, a[200005];//注意范围
map<long long, long long> m;//用map映射
int main(){
cin >> n >> c;
for (int i = 1; i <= n; i++) {
cin >> a[i];
m[a[i]]++;//储存出现次数
}
long long ans = 0;
for (int i = 1; i <= n; i++)
ans += m[a[i] - c];//累加a[i]-c的出现次数
cout << ans;//输出答案
return 0;
}
代码就是这样了,哈希代码以后再补(大概可能吧)。
9月3号补:
//哈希代码,其实把map改成unordered_map就好了
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
long long n, c, a[200005];
unordered_map<long long, long long> m;//map的一种,内部为哈希表,作者较懒,所以使用unordered_map
int main(){
cin >> n >> c;
for (int i = 1; i <= n; i++) {
cin >> a[i];
m[a[i]]++;
}
long long ans = 0;
for (int i = 1; i <= n; i++) {
ans += m[a[i]+c];
}
cout << ans;
return 0;
}
unordered_map:
头文件:#include <unordered_map>
定义:unordered_map<索引类型,变量类型> 数组名称
优点:内部使用哈希表,查找速度快
缺点:建立时间长
map:建立时间短,内部使用红黑树(严格平衡二叉排序树),查找时间o(log n)