题目链接.
方法一:暴力枚举
对于每一个数x,遍历它后面的每一个数,看两数和是否为target。两层for循环,时间复杂度O(n^2)
方法二:哈希表
1.对于每一个数x,先看哈希表中是否存在target-x,如果存在直接返回两数的下标。
2.将当前遍历的数和对应下标插入到哈希表中。
先查找哈希表后插入的原因是保证数x不会和自己匹配。
时间复杂度O(n),map中find寻找target-x为O(1)
//法1 暴力枚举
class Solution {
public:
vector<int> twoSum(vector<int>& nums,int target) {
vector<int> v;
for(int i = 0;i<nums.size();i++) {
for(int j = i+1;j<nums.size();++j) {
if(nums[i]+nums[j]==target){
v.push_back(i);
v.push_back(j);
return v;
}
}
}
return v;
}
};
//法2 哈希表
class Solution {
public:
vector<int> twoSum(vector<int>& nums,int target) {
unordered_map<int ,int> hashmap;//把值和对应的下标存入哈希表
for(int i = 0;i<nums.size();i++) {
unordered_map<int,int>::iterator it = hashmap.find(target-nums[i]);
if(it!=hashmap.end()) {
return {it->second,i};
}
hashmap.insert(pair<int,int>(nums[i],i));
//hashmap[nums[i]] = i;
}
return {};
}
};