一、概述
给出一个数组和一个目标值,找到数组中的两个值,要求它们的和为目标值。
二、分析
1、我的方法
暴力模拟,遍历数组求出值。
很简单,双循环即可。
时间复杂度极差,O(n^2),空间复杂度极好,但没屁用。
2、较好方法
使用unordered_map,即使用hash表。
观察可知,每当我们遍历过一个元素,那么就知道了该元素的存在。这对于我们找到解是有帮助的。使用哈希表存储这一信息,那么,在每遍历到一个新的元素时,我们查找哈希表,若存在我们需要的元素,那么就找到了解。返回即可。
时间复杂度O(n)。好得多。
三、总结
注意hash表的应用。
PS:代码如下:
1、我的代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
for(int i=0;i<nums.size()-1;i++)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]==target)
{
ans.push_back(i);
ans.push_back(j);
}
if(ans.size()!=0)
break;
}
if(ans.size()!=0)
break;
}
return ans;
}
};
2、时间复杂度较好的代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hash;
vector<int> ans;
for(int i=0;i<nums.size();i++)
{
if(hash.find(target-nums[i])!=hash.end())
{
ans.push_back(hash[target-nums[i]]);
ans.push_back(i);
return ans;
}
else
hash[nums[i]]=i;
}
return ans;
}
};