题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
首先来参考一下他的基础篇:(双指针)剑指 和为S的两个数字
类似的我们可以用大小端双指针的方法,两个指针在开始的时候分别指向1和2,然后把两个指针所指向的值加起来,判断他们的和与目标值的大小,来移动大小端指针。
tmp = sum, 两个指针之间的序列符合要求
tmp > sum, 此时需要去掉小值,小端指针向右移动
tmp < sum, 需要添加更大的值进来,大端指针向右移动
有一点需要想明白的是,指针的区间应为[1, (sum+1)/2]。可以举个例子1+2+3+4+5=4+5+6=7+8=15
运行时间:36ms
占用内存:9676k
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer> > res = new ArrayList<ArrayList<Integer> >();
if(sum < 3)
return res;
int boundary = (sum + 1) / 2;
int small = 1;
int big = 2;
while(big <= boundary && big > small){
int tmpsum = 0;
for(int i=small; i<=big; i++)
tmpsum += i;
if(tmpsum == sum){
ArrayList<Integer> tmp = new ArrayList<Integer>();
for(int i=small; i<=big; i++)
tmp.add(i);
res.add(tmp);
small++;
big++;
}
else if(tmpsum < sum)
big++;
else
small++;
}
return res;
}
}