题目描述:
输入一个非负整数 S,打印出所有和为 S 的连续正数序列(至少含有两个数)。
例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以结果打印出 3 个连续序列 1∼5、4∼6 和 7∼8。
示例:
输入:15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
算法思路:
本题,直接使用双指针即可解决,定义两个指针slow和fast,slow从第一个元素开始,然后fast初始位置比slow+1,依次遍历fast累加看是否达到sum值,然后将每次的值存入到list当中,满足条件将整个list存入到一个res列表当中,再次清空list。
ps
这里需要注意的是,在清空list的时候不要使用clear()方法,因为虽然clear()方法是在list添加到res集合之后再次使用的,但是list索引还是指向那个添加到元素,这样使用clear()之后还是会将集合当中的元素清空,这里可以采用要么使用一个中间列表来存储list的值,或者重建一个集合。
算法实现:
class Solution {
public List<List<Integer> > findContinuousSequence(int sum) {
//定义两个指针,整数序列不包括0
int slow = 1;
int fast = 2;
//定义一个链表用来存储元素
List<List<Integer>> list = new ArrayList<>();
//定义一个链表用来存储满足条件的结果序列
List<Integer> list2 = new ArrayList<>();
int per = 0;
while(fast<=sum){
list2.add(slow);
per = slow;
while(per+fast<sum){
list2.add(fast);
//之前的累加和
per = per+fast;
//fast指针下移动一位
fast++;
}
if(per+fast==sum){
//则把增加后的fast也加进去
list2.add(fast);
//如果满足条件那么就将当前满足条件的序列加入到结果当中
list.add(list2);
//找到结果后重新更新快慢指针
slow = slow+1;
fast = slow+1;
list2 = new ArrayList<>();
}else{
//加上最后一个fast指针不满足,重新更新
slow = slow+1;
fast = slow+1;
list2 = new ArrayList<>();
}
}
// for(List<Integer> num:list){
// System.out.println(num);
// }
return list;
}
}