1.暴力解法
枚举出所有结果
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//定义vector先不要规定容量
//因为后面的push_back()是在规定的容量之后添加数据
vector<int> ans;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
if(nums[i]+nums[j]==target){
ans.push_back(i);
ans.push_back(j);
return ans;
}
}
}
return ans;
}
};
2.利用unordered_map降低时间复杂度
unordered_map内部实现哈希表,即一个key对应一个value。map.find(key),返回值类型是迭代器,查询哈希表中是否有该key对应的value,若有,则返回迭代器的位置,若无,则返回map.end() 。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
unordered_map<int,int> map;
map[nums[0]]=0;
for(int i=1;i<nums.size();i++){
int another_num=target-nums[i];
auto iter = map.find(another_num);
//等价于
//unordered_map<int,int>::iterator iter = map.find(another_num);
if(iter == map.end()){
map[nums[i]]=i;
}else{
ans.push_back(map[another_num]);
ans.push_back(i);
return ans;
}
}
return ans;
}
};
3.补充
如果数组为有序数组,可以利用左右指针来解
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
//此题假设容器为升序
int left,right;
left = 0;
right = nums.size()-1;
while(left<right){
int sum = nums[left] + nums[right];
if(sum==target){
ans.push_back(left);
ans.push_back(right);
return ans;
}else if(sum>target) right--;
else if(sum<target) left++;
}
return ans;
}
};