两数之和
为下一个三数之和的题做准备
一、读题
二、naive 思考
因为考虑到返回的是索引,所以我上来没有采取直接排序的方法
这个题简单的一点在于它只有一组满足的样例,所以一旦找到返回就行了
利用双指针进行查找即可
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> rs;
if(nums.size()==0||nums.size()==1)return rs;
//sort(nums.begin(), nums.end());
int l = 0, r = 1;
while(l < r){
while(r < nums.size()){
if(nums[l]+nums[r]==target){
rs.push_back(l);
rs.push_back(r);
return rs;
}
r++;
}
l++;
r = l+1;
}
return rs;
}
};
但是能想到,效率肯定低
三、deeper 思考
倒是知道要用hash表优化,但光想索引那方面去了,偏了
所以借鉴了一下官方题解:
就是想到哪一部分导致耗时长,就去尽力优化哪一部分
这个题的耗时就是找匹配
假想如果我们真的要去一次遍历就查找完的话,
那肯定要确定有没有和当前能匹配的
那就要把之前的都存下来才行,用target-x来索引,得到其位置,进行返回
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//vector<int> rs;
unordered_map<int, int> hash;
for(int i=0;i<nums.size();i++){
//if(hash[nums[i]]) //这里因为可能有0的关系,不能用这个
auto it = hash.find(target - nums[i]);
if(it != hash.end()){//找到了
return {it->second, i};
}
hash[nums[i]] = i;
}
return {};
}
};