两数之和
题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
我用的是C++,因为以后想做的是游戏方向的开发,研究生实验室里做的是CV方向,所以想把C++好好学一遍(好久好久没有打代码了惭愧)。
1 暴力解法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size()-1; i++)
{
int k = target - nums[i];
for (int j = i+1; j < nums.size(); j++)
{
if (nums[j] == k)
return {i,j};
}
}
return {};
}
};
这里用的就是两个循环的暴力解法,提前把target-nums[i]算出来会比放进循环里更快一点。值得一提的是要考虑没有找到返回空值的情况,因为定义的是vector容器。
暴力解法的好处是思路清晰,而且j=k+1就确定了i和j是不相等的。
不过用的时间略多。
2 一层哈希
参考了题解以后,我知道了关联容器:unordered_map
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> m;
for(int i=0;i<nums.size();i++)
{
if(m.find(target-nums[i])!=m.end())//m中存在对应的键值
return {m[target-nums[i]],i};//因为i为较大的元素,此时添加进去的键值都还小于i,所以i在后面
m[nums[i]]=i; //向map中添加元素
}
return {};
}
};
作者:zrita
链接:https://leetcode-cn.com/problems/two-sum/solution/c-san-chong-fang-fa-jian-dan-yi-dong-ji-bai-100-z-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
运行时间直接减到了8ms。
这里贴一下unordered_map的知识供自己后面回看。
unordered_map
3 两次哈希
还有两次哈希的解法,第一次把数据存入m中,第二次find,这里就不多做叙述。
最后希望自己坚持刷题吧,冲鸭!