import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
//方法一:对于求区间和,一贯的优化技巧是使用前缀和
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
// int tmp = 0;
// for(int i=1;i<sum/2;i++){
// for(int j=i;j<sum;j++){
// tmp+=j;
// if(tmp==sum){
// ArrayList<Integer> temp = new ArrayList<>();
// for(int k=i;k<=j;k++){
// temp.add(k);
// res.add(temp);
// }
// }else if(tmp>sum){//剪枝
// tmp=0;
// break;
// }
// }
// }
// return res;
//方法二:滑动窗口
/*
* 1)设置两个下标i=1,j=1,表示窗口值为0
* 2)如果窗口值比目标值大,缩小窗口i+=1
* 3)如果窗口值比目标值小,扩大窗口j+=1
* 4)相等的话,存值,缩小窗口。
* 这里需要注意2个问题:
什么时候窗口终止呢,这里窗口左边界走到sum的一半即可终止,因为题目要求至少包含2个数
什么时候需要扩大窗口和缩小窗口?解释可看上述算法步骤。
* */
int i=1,j=1,tmp=0;
while(i<sum/2){
if(tmp<sum){
tmp+=j;
j++;
}else if(tmp>sum){
tmp-=i;
i++;
}else{
ArrayList<Integer> temp = new ArrayList<>();
for(int k=i;k<=j;k++){
temp.add(k);
}
res.add(temp);
tmp-=i;
i++;
}
}
return res;
}
}