题目大意
在数组中找到 2 个数之和等于给定值的数字,结果返回 2 个数字在数组中的下标
解题思路
简单的解决方案是 O(n^2) 运行时复杂度。
foreach (item1 in array)
{
foreach (item2 in array)
{
if (item1 + item2 == target)
{
return result
}
}
}
顺序扫描数组,对每一个元素,在 map 中找能组合给定值的另一半数字,如果找到了,直接返回 2 个数字的下标即可。如果找不到,就把这个数字存入 map 中,等待扫到“另一半”数字的时候,再取出来返回结果。
class Solution
{
public:
vector<int> twoSum(vector<int>& numbers, int target)
{
unordered_map<int,int>m;
vector<int> result;
for(int i = 0;i < numbers.size();i++)
{
// 没有找到第二个
if(m.find(numbers[i]) == m.end())
{
// 将第一个位置存储到第二个的键中
m[target - numbers[i]] = i;
}
else
{
找到第二个
result.push_back(m[numbers[i]] + 1);
result.push_back(i+1);
break;
}
}
return result;
}
};
// 我们也可以将 nums[i] 存储到 map 中,并找到target - nums[i]
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int,int>m;
vector<int> result;
for(int i = 0;i<nums.size();i++)
{
if(m.find(target - nums[i]) == m.end())
{
m[nums[i]] = i;
}
else
{
result.push_back(m[target - nums[i]]);
result.push_back(i);
}
}
return result;
}
};