两数之和是第一题,所以对于时间和内存方面的要求并不像后续题目一样要求严格,可以用暴力法直接求解。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i,j;
for(i = 0;i < nums.size();i++){
for(j = i+1;j<nums.size();j++){
if(nums[i]==target-nums[j]){
return {i,j};
}
}
}
return {i,j};
}
};
暴力法思路:通过两次循环直接进行比对,同时因为题目中说明了只有两个数字,因此不需要使用vector进行添加
思路优化:通过hash表进行存储,将位置存储进去。仅需一次遍历,每次查找当前数字与目标之间的差是否在hash表中存在。如果存在于map之中,就直接取出数据位置,若不存在,则将当前的值,作为关键字插进去,位置作为键值
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;
unordered_map<int,int> helper;
for(int i=0;i<nums.size();i++){
auto it = helper.find(target - nums[i]);
if(it != helper.end()){
res.push_back(it->second);
res.push_back(i);
}else{
helper[nums[i]]=i;
}
}
return res;
}
};
写在后面:我第一想法其实是排序之后用双指针进行查找——因为排序之后数据便具有大小顺序,那么只需比对前后指针之和,若小于target便不存在,若大于或等于,则进行移动的操作。
该思路适用于查看是否存在,两个数能满足target的条件,而该题中需要返回数字的index,而排序本身会打乱index,所以无法适用于该题(但可以通过存储index,使用结构体之类的方式进行排序),不再进行赘述。