import java.util.ArrayList; public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { int p1=1,p2=2; ArrayList<ArrayList<Integer>> res = new ArrayList<>(); if(sum <= 1) return res; while(p1 != sum/2+1 && p2!=sum){ int tmp = (p1+p2)*(p2-p1+1)/2; // 求和公式 if(tmp == sum){ ArrayList<Integer> list = new ArrayList<>(); for(int i=p1;i<=p2;i++) list.add(i); res.add(list); p2++; }else if(tmp < sum){ p2++; }else { p1++; } } return res; } }
第一种方法可以使用暴力枚举;
第二种方法可以采用这里的滑动窗口法。
滑动窗口维持一个上沿和一个下沿:
1. 如果当前滑动窗口内的值大于sum,窗口收缩,下沿上移;
2. 如果当前窗口内的值小于sum,窗口扩张,上沿上移;