41和为S的连续正数序列+注意循环条件记一下这题特殊解法
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,
他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。
现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述: 输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路:借鉴一下前面那题的思路,使用两个变量small和big,分别初始化为1,2,因为是连续几个数的和,如果tmp>um,需要循环的减去small,小于的时候加上比较大的big,数组要放在循环里面定义,这样不需要增加清空的代码。循环条件是small增加到(1+s)/2为止。不能是等于,只能小于,因为等于的时候会big= small,比如s=3的时候。
class Solution { public: vector<int> pushres(int small,int big){ vector<int> tmp; for(int i = small;i <= big;++i){ tmp.push_back(i); } return tmp; } vector<vector<int> > FindContinuousSequence(int sum) { vector<vector<int> > result; int flag = 0; if(sum <= 2){ return result; } int small = 1,big = 2; flag = small + big; int end = (1 + sum) / 2; while(small < end){//不需要判断small < big,这种情况因为small==big的情况才有可能等于sum,small<end,不可能出现这种情况 vector<int> tmp;//不需要每次都清空tmp if((flag == sum)){ tmp = pushres(small,big); result.push_back(tmp); } while((small < end) && (flag > sum)){ flag -= small; ++small; if((flag == sum) ){ tmp = pushres(small,big); result.push_back(tmp); } } ++big; flag += big; } return result; } };