小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
C++两端移动法求解
初始头p=1,求出尾e使得区间内的值刚好不大于sum,二次求根公式完事了。此时总和就是total。 循环条件 p<e(至少两个数 如果total比sum大,减去头部;total比sum小,加上尾部,注意(P++)、(++E) 当total=sum时,把p e区间的数push进tmp,再整体push进tp。 完事。
class Solution {
public:
vector<vector> FindContinuousSequence(int sum) { vector<vector>tp;
if(sum<1) return tp;
int p=1,e=(int)(sqrt(1+8sum)-1)/2;
int total=(1+e)e/2;
while(p<e){
if(total>sum) total-=(p++);
else if(total<sum) total+=(++e);
else{
vectortmp;
for(int t=p;t<=e;t++) tmp.push_back(t);
tp.push_back(tmp);
total-=(p++);
total+=(++e);
}
}
return tp; } };
基本翻译
n. 矢量;带菌者;航线
vt. 用无线电导航