1、题目描述
2、算法分析
双指针技术,就是相当于有一个窗口,窗口的左右两边就是两个指针,我们根据窗口内值之和来确定窗口的位置和宽度。双指针的出口是当低位指针low=(sum+1)/2开始及以后都将不存在能够满足和为sum的连续正序列。
3、代码
import java.util.ArrayList;
/*
在答案区找到一个答案,说的很好,叫做双指针技术,就是相当于有一个窗口,窗口的左右两边就是两个指针,我们根据窗口内值之和来确定窗口的位置和宽度。
非常牛逼的思路,虽然双指针或者所谓的滑动窗口技巧还是蛮常见的,但是这一题还真想不到这个思路。
*/
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
//存放结果
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
//两个起点 相当于动态窗口的两边 根据窗口内的值的和 来确定窗口的位置和大小
int low=1,high=2;
while(low!=(1+sum)/2){ //high>low //当small==(1+sum)/2的时候停止
//由于是连续的 差为1的序列,那么等差数列的求和 (a0+an)*n/2
int curnum =(low+high)*(high-low+1)/2;
//相等那么窗口范围内的所有数加入结果集
if(curnum==sum){
ArrayList<Integer> list = new ArrayList<>();
for(int i=low;i<=high;i++){
list.add(i);
}
res.add(list);
low++;
}else if(curnum<sum){
high++;
}else{
low++;
}
}
return res;
}
}