题目
思路
哈希表查找,通过空间换时间达到O(n)的时间复杂度。
AC代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int N,C;
cin>>N>>C;
int *arr;
arr = new int [N+1];
for(int i=1;i<=N;++i){
cin>>arr[i];
}
long int count_num=0;
unordered_map<int,int> m;
for(int i=1;i<=N;++i){
m[arr[i]]++;
}
//哈希表
for(int i=1;i<=N;++i){//对于每一个数都有不同的取法
if(m[arr[i]-C]!=0) count_num+=m[arr[i]-C];
}
cout<<count_num;
delete[] arr;
}
二分的方法(现在才发现stl的lower_bound与upper_bound)应该不算晚,注意返回的是地址。
#include <bits/stdc++.h>
using namespace std;
int main(){
int N,C;
cin>>N>>C;//C是差
int *arr;
arr = new int [N+1];
for(int i=1;i<=N;++i){
cin>>arr[i];
}
sort(arr+1,arr+1+N);
long int count_sum=0;
for(int i=1;i<=N;++i){
int a=lower_bound(arr+1,arr+1+N,arr[i]-C)-arr;//第一个等于arr[i]-C的位置
int b=upper_bound(arr+1,arr+1+N,arr[i]-C)-arr;//第一个大于arr[i]-C的位置
if(arr[a]==arr[i]-C)
count_sum+=b-a;
}
cout<<count_sum;
}