给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]第一种解法:就是遍历数组中的两数之和,将和等于target的位置输出,时间复杂度为O(n2)
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]==target)
{
vector<int> result{i,j};
return result;
}
}
}
}
};
第二种解法:一般来说,我们为了提高时间的复杂度,需要用空间来换,这算是一个trade off吧,我们只想用线性的时间复杂度来解决问题,那么就是说只能遍历一个数字,那么另一个数字呢,我们可以事先将其存储起来,使用一个HashMap,来建立数字和其坐标位置之间的映射,我们都知道HashMap是常数级的查找效率,这样,我们在遍历数组的时候,用target减去遍历到的数字,就是另一个需要的数字了,直接在HashMap中查找其是否存在即可,整个实现步骤为:先遍历一遍数组,建立HashMap映射,然后再遍历一遍,开始查找,找到则记录index。
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int, int> m;
vector<int> res;
for (int i = 0; i < nums.size(); ++i)
{
m[nums[i]] = i;//将nums中的key与value对应输入到map<int,int>m中
}
for (int i = 0; i < nums.size(); ++i)
{
int t = target - nums[i];//计算出所需要差的value保存到t中
if (m.count(t))//如果存在t
{
res.push_back(i);
res.push_back(m[t]);//输出对应的key
break;
}
}
return res;
}
};