输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
限制:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^6
1.用set表示hash法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
set<int> hash;//由于是变长且数字大小不知,hash只能用stl表示
for(auto i : nums){//迭代器遍历的一种写法,表示用遍历容器nums,下标变量是i;
if(hash.count(target - i)){//因为不能像数组一样hash[hash[i]],只能用count()返回容器中查找元素的数量,如果返回>0那说有符合和i相加为target的数
return vector<int> {i, target - i};//一种初始化方式
}else hash.insert(i);//没有就插入hash;
}
return vector<int> {1, 1};
}
};
非常慢,内存很多
2.双指针
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int x = 0, y = nums.size() - 1;
while(x < y){//x变大和变大,y变小和变小,我不需要把一个x对应的所有y都遍历,同步进行
if(nums[x] + nums[y] == target)
return vector<int> {nums[x], nums[y]};
else if(nums[x] + nums[y] > target)
y--;
else x++;
}
return vector<int> {1, 1};
}
};
优化很多