LeetCode题解——两数之和
- 题目介绍
- 思路分析
以一个数为参考点人,然后通过输入的target获取到另一个数,在到当前nums里面寻找另一个数是否存在,记下下标返回。
方法一:暴力破解法,双重循环(时间换空间,不会产生多余的空间)
示例:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res = {0,0};
for(int i = 0;i<nums.size();i++) {
res[0] = i;
for(int j = i+1;j<nums.size();j++) {
if((nums[i]+nums[j]) == target) {
res[1] = j;
return res;
}
}
}
return res;
}
};
方法二:用一个key-value的数据结构来存储数据,然后当成字典,来供查询,是否存在 (用空间换时间,map或者hash_map的查询很快,但需要多余的空间)
示例:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;
int find_key = 0;
map<int, int> tmap; //可以用map或者hash_map(c查询快,但是有hash操作)
for(int i = 0;i<nums.size();i++) {
try {
find_key = tmap.at(target-nums[i]); //此处用了at直接返回数据值,即下标,也可以用find函数
} catch (const std::out_of_range& oor) { //当at目标不存在会报out_of_range错误
tmap[nums[i]] = i;
continue;
}
res.push_back(find_key);
res.push_back(i);
break;
}
return res;
}
};