题目描述
读入一个有n个数的整形数组,并给出一个和值sum,判断是否存在两个数字使得它们的和为sum。
输入描述
输入数据包括两行:
第一行两个整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 10 ^ 9)
第二行n个整数,范围均在32位整数内,以空格分隔
输出描述
如果找到和值为某值的两个数,输出两个数字的下标(数组下标从0开始),如果有多解,输出第一个数下标最小的那个解;否则输出false
输入
6 9
2 3 5 6 7 10
输出
0 4
题目分析
这道题主要是用到map来进行辅助存储,利用key和value查找的快捷,可以很快速的通过知道a[i]和sum,来找出那个sum-a[i]。详情请看代码注释。
代码
C++代码如下:
#include<iostream>
#include<map>
using namespace std;
int main(){
int n,i,sum,a[1024];
map<int,int> differ;
cin>>n>>sum;//输入元素个数n和两数字的和sum
for(i=0;i<n;i++)
{
cin>>a[i];
differ[a[i]]=i;//map的key存的是数组的值,value则是数组中值所对应的下标
}
for(i=0;i<n;i++)
if(differ.count(sum-a[i]))//当用sum减去数组中的一个元素时,寻找剩下的差值在map中是否存在,
break; //如果存在则这个数在map中的value就是这个数在数组中的下标
if(i==n)
cout<<"false"<<endl;
else
cout<<i<<" "<<differ[sum-a[i]]<<endl;
}