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) 的时间复杂度。这个算法非常高效,特别是当数组很大时。