
Problem: 剑指 Offer 57. 和为s的两个数字
首先来讲解一下本题的思路
nums这个数组中进行寻找,如果找到了两个数相加之和为target的话,那构成一个结果集并返回
接下去我们来分析一下本题的思路
for(int i = 0;i < nums.size(); ++i)
for(int j = i + 1;j < nums.size(); ++j)

left指针指向最左端,一个right指针指向最右端,通过前后遍历去寻找哪两个数可以构成结果为【target】
nums[left] + nums[right] < target,那此时我们就可以去做一个取巧的工作target要来得小了,和【21】前面的这个几个数就要来得更小了,此时我们无需再去多次一举进行比较。此时只需执行left++
nums[left] + nums[right] > target的情况,那我们知道这种情况也是不符合的,但是呢再去进行判断的时候我们还可以做进一步的简化target了,那么其余的【15】和【19】岂不是更加会超过了?right--

考虑到最坏的情况,即为我们在遍历寻找的时候两个左右指针相遇了,即为没找到,那也就是把这个序列遍历了一遍,其时间复杂度 O ( n ) O(n) O(n)
没有开辟任何额外的空间,所以空间复杂度为 O ( 1 ) O(1) O(1)
以下是代码展示
{nums[left], nums[right]},可能有的小伙伴不是很清楚,此属于 C++初始化列表 的相关知识class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
int sum = 0;
while(left < right)
{
sum = 0;
sum = nums[left] + nums[right];
if(sum < target){
left++;
}else if(sum > target){
right--;
}else{
return {nums[left], nums[right]};
}
}
return {-1, -1};
}
};
