1. 题目描述
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
2. 思路
滑动窗口机制:左、右指针只能向右移动,不能向左移动。
(1)初始:左指针、右指针都指向0,它们的和sum=0;
(2)如果它们的和小于目标值,则右指针向右移动,它们的和要加上新的右指针的值;
(3)如果它们的和大于目标值,则左指针向右移动,它们的和要减去左指针的值;
(4)如果它们的和等于目标值,则将数据保存到结果中(最好通过例子进行赋值),并将左指针向右移动,继续向右滑动。
3. 代码分析
class Solution {
public int[][] findContinuousSequence(int target) {
//用于存放二维数组的值
List<int[]> res = new ArrayList<int[]>();
int l=0,r=0;
int sum=0;
//左指针只需要到中间就好,再向右移动则不满足条件了
while(l<=target/2){
if(sum<target){
r++;
sum = sum+r;
}else if(sum>target){
l++;
sum = sum-l;
}else{
int[] temp = new int[r-l];
for(int i=l;i<r;i++){
temp[i-l] = i+1;
}
res.add(temp);
l++;
sum = sum-l;
}
}
return res.toArray(new int[res.size()][]);
}
}