描述
给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)
数据范围:2≤len(numbers)≤1052≤len(numbers)≤105,−10≤numbersi≤109−10≤numbersi≤109,0≤target≤1090≤target≤109
要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
示例1
输入:
[3,2,4],6
返回值:
[2,3]
说明:
因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以返回[2,3]
class Solution {
public:
// //这个方法不行,会超时
// vector<int> twoSum(vector<int>& numbers, int target) {
// vector<int> all;
// // write code here
// for(int i=0;i<numbers.size();i++)
// {
// for(int j=i+1;j<numbers.size();j++)
// {
// if(numbers[i]+numbers[j]==target)
// {all.push_back(i+1);
// all.push_back(j+1);}
// }
// }
// return all;
// }
vector<int> twoSum(vector<int>& numbers, int target) {
unordered_map<int, int> mp;
vector<int> result;
for (int i = 0; i < numbers.size(); i++) {
int complement = target - numbers[i];
if (mp.find(complement) != mp.end()) {
result.push_back(mp[complement]); // 补数的下标
result.push_back(i + 1); // 当前数字的下标
break; // 找到一组解,结束循环
}
//将暂时没有的数字及下标存入
mp[numbers[i]]=i+1;
}
return result;
}
};
总结:用到哈希和数组,理解哈希的存储原理,可以通过key值获取value值,不再是传统的下标获取。unordered_map<key,value>的key不能重复,会自动去重。