64.和为S的连续正数序列
输入一个非负整数 S,打印出所有和为 S 的连续正数序列(至少含有两个数)。
例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以结果打印出 3 个连续序列 1∼5、4∼6 和 7∼8。
数据范围:
0≤S≤1000
样例:
输入:15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
代码:
class Solution {
public List<List<Integer> > findContinuousSequence(int sum) {
//存储结果的列表,每个元素是一个连续序列
List<List<Integer>>res = new ArrayList<>();
//当前窗口内数字的和
int count = 0;
//使用滑动窗口法,i是窗口左边界,j是窗口右边界
//因为至少需要两个数,所以i最大不超过sum/2
for(int i = 1,j = 1;i<=sum/2;){
if(count<sum){
//当前和小于目标值,扩大窗口(右边界右移)
count+=j;
j++;
}else if(count>sum){
//当前和大于目标值,缩小窗口(左边界右移)
count-=i;
i++;
}else{
//当前和等于目标值,找到一个有效序列
List<Integer> temp = new ArrayList<>();
//将窗口内的数字加入临时列表
for(int k = i;k<j;k++)temp.add(k);
//将找到的序列加入结果列表
res.add(temp);
//继续寻找其他可能的序列(左边界右移)
count-=i;
i++;
}
}
//返回所有找到的连续序列
return res;
}
}