BM50 两数之和
1. 问题描述
2. 样例说明
3. 思路
不可行的简单方法:如果直接使用暴力解法,用两个for循环判断两个数的和是否等于target,必然会超时。
正确的思路:使用哈希表,因为哈希表查找时间为O(1)。
- 建立一个哈希表,键值对为<数组某个值,对应下标>
- 从开始处遍历数组,对于第i个位置,在哈希表中寻找
target-nums[i]
是否存在,若存在,将两个下标放入数组中返回;若不存在,将其添加至表中,继续遍历。
4. 代码
class Solution {
public:
/**
*
* @param numbers int整型vector
* @param target int整型
* @return int整型vector
*/
vector<int> twoSum(vector<int>& numbers, int target) {
// write code here
vector<int> ans;
unordered_map<int,int> hashmap;
for(int i=0;i<numbers.size();i++){
if(hashmap.find(target-numbers[i])!=hashmap.end()){
ans.push_back(hashmap[target-numbers[i]]+1);
ans.push_back(i+1);
return ans;
}
else {
hashmap[numbers[i]]=i;
}
}
return ans;
}
};
5. 时间空间复杂度分析
只遍历数组一次,且在哈希表中查找的时间复杂度为O(1),因此总时间复杂度为O(N);该方法需要构建哈希表,因此空间复杂度为O(N)。