剑指OFFER题35------按牛客网通过率排序
时间:2019.1.1.1951
作者:Waitt
题目
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
时间限制:1秒 空间限制:32768K 热度指数:169695
解答
利用两个数字(指针),mi指向序列最小值,ma指向序列最大值,求mi至ma中间数之和he。
- he小于给定值时,ma加一,he在加上最大值;
- he大于给定值时,he=he-mi,mi加一;
- he等于给定值时,将mi至ma中的数存入向量,改变当前状态。
结束条件:mi小于ma,并且mi小于给定值的一半+1;
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int> > a;
if(sum<3)//特殊判断
return a;
int mi=1,ma=2;
int en=sum/2+1;//结束循环条件之一
int he=mi+ma;
while(mi<ma&&mi<en)//循环结束条件
{
if(he<sum)
{
ma++;
he=he+ma;
}
else if(he>sum)
{
he=he-mi;
mi++;
}
else
{
vector<int> b;
for(int i=mi;i<=ma;i++)
b.push_back(i);
a.push_back(b);
//改变当前状态,不然会在此处无限循环
he=he-mi;
mi++;
}
}
return a;
}
};