您的位置:首页 > Web前端

和为S的连续正数序列(剑指offer) 两个个指针的应用

2015-10-09 17:03 309 查看
和为S的连续正数序列

参与人数:1005时间限制:1秒空间限制:32768K
通过比例:26.06%
最佳记录:0 ms|0K(来自  平方宁


题目描述

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序


链接:http://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路:和前面题意一样,用两个指针来控制区间段,小了,后的指针往后移动;大了,前指针后移;

#include<cstdio>
#include<vector>
using namespace std;

class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
int start=1,end=2;
vector<vector<int> >arr;

if(sum<start+end) return arr;
int tmp=start+end;
while(start+end<sum||end-start==1)
{
// printf("start=%d\tend=%d\n",start,end);
if(tmp<=sum)
{
if(tmp==sum)
{
int i=start;
int j=end;
vector<int> vec;
while(i<=j)
{
vec.push_back(i++);
}
arr.push_back(vec);
}
end++;
tmp+=end;
}
else
{
tmp-=start;
start++;
}
}
return arr;
}
};
int main()
{
int n;
Solution so;
while(~scanf("%d",&n))
{
vector<vector<int> >arr=so.FindContinuousSequence(n);
for(int i=0;i<arr.size();i++)
{
for(int j=0;j<arr[i].size();j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针 剑指offer