cpp
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
if(nums.size() == 2)
return {0, 1};
unordered_map <int, int> mapnums;
for(int i = 0;i < nums.size();i++)
{
if(mapnums.count(target - nums[i]))
{
return {mapnums[target - nums[i]],i};
}
mapnums[nums[i]] = i;
}
return {-1,-1};
}
};
-
输入验证:
- 首先,代码检查
nums的大小是否为 2。如果是,则直接返回{0, 1}。这是一个边界情况的处理,因为当数组只有两个元素时,它们必然是目标值的和。
- 首先,代码检查
-
使用哈希表:
- 接下来,代码创建了一个
unordered_map(无序映射)mapnums,用于存储数组中的每个元素及其对应的索引。
- 接下来,代码创建了一个
-
遍历数组:
- 使用一个
for循环遍历数组nums。 - 在每次迭代中,检查
mapnums是否包含target - nums[i]这个键。这是基于这样一个事实:如果数组中存在两个数a和b,使得a + b = target,那么对于数组中的任意一个数a,另一个数b必然是target - a。
- 使用一个
-
找到匹配项:
- 如果在
mapnums中找到了target - nums[i]这个键,说明找到了两个数的和为target。此时,返回这两个数的索引:mapnums[target - nums[i]](target - nums[i]的索引)和i(当前遍历到的nums[i]的索引)。
- 如果在
-
更新哈希表:
- 如果在
mapnums中没有找到target - nums[i],则将当前元素nums[i]和其索引i添加到mapnums中,以便在后续的迭代中进行查找。
- 如果在
-
返回默认结果:
- 如果循环结束后仍然没有找到和为
target的两个数,则返回{-1, -1},表示没有找到这样的两个数。
- 如果循环结束后仍然没有找到和为
-
这个算法的时间复杂度是 O(n),其中 n 是数组
nums的大小。因为只需要遍历一次数组,而每次查找哈希表的操作都是 O(1) 的时间复杂度。这个算法非常高效,特别是当数组很大时。