题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
哈希表一遍循环法
由于博主只是一个刚开始学习C++的菜鸡,看懂这个一边循环的做法还是花了一定的时间的,代码里有详细的注释可以参考。
用哈希表实现了空间换时间,不用暴力两遍循环,程序的执行速度还是非常快的。
class Solution
{
public:
vector<int> twoSum(vector<int> &nums,int target)
{
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++)
{
if(map.find(target-nums[i])!=map.end())
return {map[target - nums[i]], i};
else
map[nums[i]] = i;
}
//map.end返回尾后迭代器
//end返回的迭代器不指向任何元素,而是指向unordered_map容器中最后一个元素之后的位置(其过去的位置)
//i=0,map.find(7)=map.end(),可理解为二者都不存在,所以执行else:map(2)=0
//i=1,map.find(2)=0!=map.end(),return{map[2]=0,i=1}
//很好地避免了数组中同一个元素不能使用两遍的问题
return {};//注意返回值是向量类型的容器,动态数组
}
};
测试一下:
int main()
{
vector<int> example = {2, 7, 11, 15};
int target = 9;
Solution wisdom = Solution();
vector<int> output = wisdom.twoSum(example, target);
cout << output[0] << " " << output[1] << endl;
system("pause");
}
其他方法就相对比较好理解了,有时间写吧。
关于unordered_map:
参考了这篇文章:
unordered_map用法详解