题意
解法1—哈希表
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_set<int>uset;//num1+num2=target
for(int num:nums)
{
if(uset.find(target-num)!=uset.end())
{
return vector<int>{target-num,num};
}
else
{
uset.insert(num);
}
}
return {};
}
};
解法2—双指针
哈希表解法空间复杂度为O(n),注意本题的 nums 是 排序数组 ,因此可使用 双指针法 将空间复杂度降低至 O(1) 。
算法流程:
- 初始化: 双指针 i ,jj 分别指向数组 nums 的左右两端 (俗称对撞双指针)。
- 循环搜索: 当双指针相遇时跳出;
- 计算和 s = nums[i] + nums[j];
- 若 s > target ,则指针 j 向左移动,即执行 j = j - 1;
- 若 s < target ,则指针 i 向右移动,即执行 i = i + 1 ;
- 若 s = target ,立即返回数组 [ nums[i], nums[j] ];
- 返回空数组,代表无和为 target 的数字组合。
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
//解法1:哈希表
/*
unordered_set<int>uset;//num1+num2=target
for(int num:nums)
{
if(uset.find(target-num)!=uset.end())
{
return vector<int>{target-num,num};
}
else
{
uset.insert(num);
}
}
return {};
*/
//解法2:对撞双指针
int i=0,j=nums.size()-1;
while(i<j) //注意条件是i<j;当 i=j 时,i和j指向同一个元素没意义。
{
int s = nums[i]+nums[j];
if(s>target)
j--;
else if(s<target)
i++;
else
return vector<int>{nums[i],nums[j]};
}
return {};
}
};