剑指 Offer 57 - II. 和为s的连续正数序列
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
限制:
1 <= target <= 10^5
核心:滑动窗口,双指针,动态计算和
class Solution {
public int[][] findContinuousSequence(int target) {
ArrayList<int[]> lists = new ArrayList<>();
//i为滑动窗口的前指针
//j为滑动窗口的后指针
int i=1,j=2;
//sum为滑动窗口的初始和,动态计算滑动窗口的和
int sum=3;
while(i<j){
//如果和与目标值相等,记录数组
if(sum==target){
int[] nums = new int[j-i+1];
int index=0;
for (int k = i; k <= j; k++) {
nums[index++]=k;
}
lists.add(nums);
}
//和大于目标值,则减去滑动窗口中最小的值,即滑动窗口中的i
if (sum>target){
//先减去滑动窗口中的i值再++
sum-=i;
i++;
//和小于目标值,则j往后移一位,加上滑动窗口的后一位,即j+1
}else if(sum<target){
//先j++再进行加入sum
j++;
sum+=j;
//和等于目标值,在进入语句前已经记录数组,因此j++且i++计算下一个值
}else{
j++;
sum+=j-i;
i++;
}
}
return lists.toArray(new int[0][]);
}
}