解法一:hashmap
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>//里面有isdigit():数字字符返回true
using namespace std;
int main(){
int n,pay;
scanf("%d %d",&n,&pay);
int face;
int hashTable[1010]={0};//防止随机给数,初始化为0
for(int i=0;i<n;i++){
scanf("%d",&face);
hashTable[face]++;
}
for(int i=0;i<pay;i++)//面值最大是1000
{
//循环终条件<pay 不是小于1001,因为可能会出现pay小于i
if(hashTable[i]&&hashTable[pay-i]){
if(i==pay-i&&hashTable[i]<2)
continue;
printf("%d %d",i,pay-i);
return 0;
}
}
printf("No Solution") ;
return 0;
}
注意点:
//静态全局数组和全局数组定义后,虽未初始化,但编译器默认用数值0填充;
//静态局部数组定义后,未初始化,结果也是自动填充0;
//局部数组就不一样,定义后不初始化,数组各元素值将用随机数值填充。
解法二:
two pointers
#include<iostream>
#include<cstdio>
#include<math.h>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int maxn=100010;
int ans[maxn];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>ans[i];
}
int left=0,right=n-1;
sort(ans,ans+n);
while(left<right){
if(ans[left]+ans[right]==m){
cout<<ans[left]<<" "<<ans[right];
return 0;
}else if(ans[left]+ans[right]<m){
left++;
}else{
right--;
}
}
cout<<"No Solution";
return 0;
}
解法三:二分法
#include<iostream>
#include<cstdio>
#include<math.h>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int maxn=100010;
int ans[maxn];
int find(int left,int right,int key){
while(left<=right){
int mid=(right+left)/2;
if(ans[mid]==key)return mid;
else if(ans[mid]<key) left=mid+1;
else right=mid-1;
}
return -1;//没找到
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>ans[i];
}
sort(ans,ans+n);
for(int i=0;i<n;i++){
int temp=find(i+1,n-1,m-ans[i]);
if(temp!=-1 )
{
cout<<ans[i]<<" "<<ans[temp];
return 0;
}
}
cout<<"No Solution";
return 0;
}