和为s的连续正数序列
这个题可以发现首先是连续子序列,然后要求和为s的连续子序列,所以很显然是滑动窗口法.这里要注意的是这是一个不固定窗口大小的滑动窗口,用for循环还是while循环的判断方式就是是否在start++之后,end要++,这个很显然不能,因为如果此时大于sum,减掉之后s是可能符合的,所以不能使end++,而应该用while将判断隔开。
用while的话所以进入窗口后有三种状态,第一种是符合结果,则输出,然后扩大或者减小窗口都行。第二种是小于结果,需要减小窗口,此时要先去掉结果中的值,然后窗口边界再加。第三种是小于结果,需要增加值,这时要先扩大边界值,然后再加。(对应于for循环中增加完之后最后再加)
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
int start=1,end=2;
int s=3;
while(start<end){
if(s<sum){
end++;
s+=end;
}else if(s==sum){
ArrayList<Integer> list=new ArrayList<Integer>();
for(int i=start;i<=end;i++){
list.add(i);
}
res.add(list);
end++;
s+=end;
}else{
s-=start;
start++;
}
}
return res;
}
}