目录
题目一:
分析:
我们维护两个指针,一个指向左端,一个指向右端,向中间靠拢。
如果两个数字加起来大一些怎么办呢?由于是递增数组,那就把右边的往左边移,反之把左端指针向右移,代码如下所示:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
while(left<right)
{
int result=nums[left]+nums[right];
if(result==target)
{
return vector<int>{nums[left],nums[right]};
}
else if(result>target)
{
--right;
}
else
{
++left;
}
}
return {};
}
};
结果如下所示:
题目二:
是的没错,又是神奇的双指针,由于题目里面讲了至少含有两个数,target是不是范围错了。。。
然后我们用一前一后的指针来记录一个滑动的窗口。
如果这个窗口里边的和大于target怎么办呢?移动右边的只会更大,所以我们要把左边的端缩向右边。
如果小于target怎么办呢?同理,我们要把右端往右移更多。
把上述思路写成代码如下所示:
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
int left=1,right=2,mid=(target+1)/2;
int curSum=left+right;
vector<vector<int>> ans;
while(left<mid)
{
if(curSum==target)
{
vector<int> unit;
for(int i=left;i<=right;++i)
unit.push_back(i);
ans.push_back(unit);
//之前没进行下面这两步导致超时
curSum-=left;
++left;
}
else if(curSum>target)
{
curSum-=left;
++left;
}
else
{
curSum+=++right;
}
}
return ans;
}
};
这里边有一些细节:
1.如果发现和target相等了,要注意改变区间,否则会一直循环的。。。那是改左右的哪边呢?其实都没事~想想好像也是这么一回事。。。
2.区间和可以逐次加减,感觉这优雅一点,如果你想首项加末项当然也可以~