题目:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
原则:一般都是左闭右开,滑动窗口
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> list = new ArrayList<int[]>();
int left =1;
int right =1;
int sum =0;//用来计算和
//左闭右开
while(left<(target+1)/2){
if(sum <target){
//需要往右边走
sum += right;//在移动过程中,需要注意sum的变化
right ++;
}
if(sum > target){
//说明大了,需要左边走
sum -= left;
left ++;
}
if(sum ==target){
//这个时候符合要求
int[] arr = new int[right - left];
for(int i=left;i<right;i++){
arr[i-left] = i;
}
list.add(arr);
//改变窗口,继续移动
sum -= left;
left ++;
}
}
return list.toArray(new int[list.size()][]);
}
}