问题描述
题目
给定一个目标值 target,请你在不包含重复元素的按升序排列的整数数组 a中,找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。
例如:给定 a= [2, 7, 10, 15], target = 17,因为 a[1] + a[2] = 7 + 10 = 17,所以返回 [1 2]。
输入样例
17 7
1 3 5 7 10 11 19
输出样例
3 4
思路
我们遍历数组a,把检查过的元素和下标存入哈希表中,如果检查到某一元素和哈希表中的某个元素刚好相加等于目标值,则输出这两个数的下标。由于题目提示每种输出只会对应一个答案,所以在输出后便停止检查,返回。
代码实现
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
int main(){
int target,n;//读取目标值和数组元素个数
cin>>target>>n;
vector<int> nums;
for(int i=0;i<n;i++){
int tmp;
cin>>tmp;
nums.push_back(tmp);//用vector存数组元素
}
unordered_map<int,int> keep;//声明无序的哈希表
for(int i=0;i<n;i++){
auto it=keep.find(target-nums[i]);//利用auto方便地声明迭代器,如果哈希表中没有能与目前的元素配对的元素,则find函数会返回keep.end()
if(it!=keep.end()){//如果找到了,把这两个元素输出
cout<<it->second<<" "<<i;//值存储的是元素的下标,所以输出second
return 0;
}
else//如果没有找到,则将该元素也加入哈希表中
keep.insert(pair<int,int>(nums[i],i));
}
}