一.题目描述
二.思路一
如果该数组不是排好顺序的,我们可以考虑使用hash表存储vector中的值,第二次遍历时直接就可以find(target-nums[i])?=map.end()
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> map;
for (auto& i : nums) {
map.emplace(i, 1);
}
for (auto& i : nums) {
if (map.find(target - i) != map.end()) {
return { i,target - i };
}
}
return {};
}
};
三.思路二
根据排序的这一特性我们可以想到使用双指针来实现O(1)的空间复杂度,设置两个指针分别指向头和尾,如果当前sum<target,++i 如果sun>target,--j 最后直到找到target(因为题目条件一定会找到target)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i = 0, j = nums.size() - 1;
int sum = 0;
while (i < j) {
sum = nums[i]+nums[j];
if (sum < target) {
++i;
}
else if (sum > target) {
--j;
}
else return { nums[i],nums[j] };
}
return {};
}
};
小结
双数之和,三数之和,四数之和都可以借用双指针的思想来解题.如果target与sum值不同,可以前后移动指针来寻找更优解.