给定一组整数,还有一个目标数,在给定的一组整数中找到2个数字,使其和为目标数。
如找到,解是唯一的。找不到则显示 "no answer"。
输入格式:
第1行中给出一组整数。 在第2行输入目标数。
输出格式:
在一行中从小到大输出这2个数。
如果找不到,则显示 "no answer"。
输入样例:
在这里给出一组输入。例如:
2 7 11 15 9
输出样例:
在这里给出相应的输出。例如:
2 7
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
做法1、碰撞指针
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> val;
int ans;
for(int i=0; scanf("%d",&ans)!=EOF; i++) val.push_back(ans);
sort(val.begin(),val.end()-1);
for(int i=0; i<val.size()-1; i++)
{
int l = 0,r = val.size()-1;
int targer = *(val.end()-1) - val[i];
while(l<r)
{
int mid = (l+r)>>1;
if(val[mid]>=targer) r = mid;
else l = mid+1;
}
if(targer == val[r] && r!=i)
{
cout<<val[i]<<" "<<val[r]<<endl;
return 0;
}
}
cout<<"no answer";
return 0;
}
做法二:暴力
#include <bits/stdc++.h>
using namespace std;
int main()
{
int i=0;
vector<int> val;
int ans;
for(i=0; scanf("%d",&ans)!=EOF; i++) val.push_back(ans);
sort(val.begin(),val.end()-1);
auto d=val.end()-1;
int flag = 0;
for(auto l=val.begin();l!=val.end()-1;l++)
{
for(auto r=l+1;r!=val.end()-1;r++)
{
if( (*l)+(*r)==(*d) )
{
flag = 1;
cout<<*l<<" "<<*r;
}
}
}
if(!flag) cout<<"no answer";
return 0;
}