您的位置:首页 > 其它

递增数列中和为s的两个数字,和为s的连续正数序列

2016-07-29 17:04 344 查看
和为s的两个数,利用begin,end两个位置标志和为s前后两个元素,当和大于s,end前移,和小于s,begin后移
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int>res;
if(array.size()==0)
return res;
bool found=false;
int cursum=0;
int begin=0;
int end=array.size()-1;
while(begin<end)
{
cursum=array[begin]+array[end];
if(cursum==sum)
{
res.push_back(array[begin]);
res.push_back(array[end]);
found=true;
break;
}
else if(cursum<sum)
begin++;
else
end--;

}
return res;
}


和为s的连续正整数序列,让small初始为1,big初始为2,cursum初始为small+big,当smal小于(s+1)/2时,big递增,cursum+big;当cursum比当前s大时,cur-small,small前移,如果cursum和s相等,加入结果序列

void addtoresult(int small,int big,vector<int>&num,vector<vector<int>>&res)
{
num.clear();//每次记录新的序列前应该清除旧的序列
for(int i=small;i<=big;i++)
{
num.push_back(i);
}
res.push_back(num);
}
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>>res;
vector<int>num;
if(sum==1 ||sum==2)
{
return res;
}
int small=1;
int big=2;
int middle=(1+sum)/2;
int cursum=small+big;
while(small<middle)
{
if(cursum==sum)
{
addtoresult(small,big,num,res);
}
while(cursum>sum&&small<middle)
{
cursum-=small;
small++;
if(cursum==sum)
addtoresult(small,big,num,res);
}
big++;
cursum+=big;
}
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: