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,窗口扩张,上沿上移;

京公网安备 11010502036488号