题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路
使用双指针,指向序列的头尾,
若里面数字之和=sum,就找到一组了
若和<sum,说明序列中数太少,把尾指针再往后移
若和>sum,说明序列中数太多,把首指针再往后移
实现
import java.util.ArrayList;
public class Solution {
//使用双指针,指向序列的头尾,若里面数字之和=sum,就找到一组了
//若和<sum,说明序列中数太少,把尾指针再往后移
//若和>sum,说明序列中数太多,把首指针再往后移
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
//定义序列的首尾指针:初始就是1~2
int head=1,tail=2;
//向后移动指针,寻找满足和为sum的所有序列,加入到list中
while(head<tail){
//求出当前序列中所有元素之和:因为是连续序列,所有和可以用头尾表示出来
int cur=(head+tail)*(tail-head+1)/2;
//若和=sum,就找到一组了,遍历该序列,把这个序列中的元素装进list,再把list装进结果集
if(cur==sum){
ArrayList<Integer> list=new ArrayList<>(); //这个list的定义不能放在最外面,会重复添加
for(int i=head;i<=tail;i++){
list.add(i);
}
res.add(list); //找到一个就装进去,保证有序
head++; //head继续向后移动,寻找下一组序列
}
//若和<sum,说明序列中数太少,把尾指针再往后移
else if(cur<sum){
tail++;
}
//若和>sum,说明序列中数太多,把首指针再往后移
else{
head++;
}
}
return res;
}
}