输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
滑动窗口法:O(N)
起始点坐标:0
终点坐标:1
由于是连续序列,故为等差数列,n*(a0 + an)/2 求和
如果当前和小于 S ,则,end++
如果当前和大于S,则 start++
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
int start = 1;
int end = 2;
int tmp;
vector<int>v;
vector<vector<int> >ans;
// int middle = (sum+1)/2; 优化时间的做法
while(start<end)
{
tmp = (end-start+1)*(start+end)/2;
if (tmp==sum)
{
v.clear();
for (int i=start;i<=end;i++)
{
v.push_back(i);
}
ans.push_back(v);
start++;
}
else if (tmp<sum)
{
end++;
}
else if (tmp>sum)
{
start++;
}
}
return ans;
}
};
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int start = 0;
int end = array.size()-1;
vector<int>ans;
while(start<end)
{
int tmp = array[start] + array[end];
if (tmp==sum)
{
ans.push_back(array[start]);
ans.push_back(array[end]);
break;
}
else if (tmp<sum)
{
start++;
}
else if (tmp>sum)
{
end--;
}
}
return ans;
}
};