例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
注意: 由于序列至少有两个元素且连续,所以序列起始元素最大不超过(int)(n/2), 结束元素最大不超过(int)(n/2) + 1, 因此无需遍历 1...n-1。
方法1.
使用枚举的方法,两个for循环可以搞定。时间复杂度O(n^2)。void CountinousSequenceSum_1(int n)
{
if(n < 3)
return;
int sum;
for(int i = 1; i < n/2 + 1; i++)
{
sum = i;
for(int j = i + 1; j < n/2 + 2; j++)
{
sum += j;
if(sum == n)
{
for(int k = i; k < j + 1; k++)
cout << k << " ";
cout << endl;
}
}
}
return;
}
方法2.
因为整数序列是有序的,可以设立两个游标small,big,通过判区间[small,big]的和是否为N来得到这个序列。如果区间和大于n,small往前移动,如果小于 n,big往前移动,等于就输出
这个区间。时间复杂度是0(n)。
void CountinousSequenceSum_2(int n)
{
if(n < 3)
return;
int start = 1, end = 2;
int sum = start + end;
while(end < n/2 + 2)
{
if(sum == n)
{
for(int i = start; i < end + 1; i++)
cout << i << " ";
cout << endl;
end++;
sum += end;
}
else if(sum > n)
{
sum -= start;
start++;
}
else
{
sum += end + 1;
end++;
}
}
}
没有评论:
发表评论