classSolution{
List<int[]> ans =newArrayList<>();publicint[][]findContinuousSequence(int target){for(int i =1;i<=target/2;i++){find(target,i,i);}return ans.toArray(newint[ans.size()][]);}publicvoidfind(int target,int key,int i){if(target - key <0){return;}if(target - key ==0){int[] res =newint[key - i +1];for(int j =0;j< key - i +1;j++){
res[j]= i + j;}
ans.add(res);}find(target - key,key +1,i);}}
双指针,滑动窗口
首先需要明白,连续正整数序列和怎么求。
sum = (x + y)*(y - x + 1)/2
如果sum < target,则说明指针 y 还可以向右拓展使得 sum 增大,此时指针 y 向右移动,即 y++;
如果sum > target,则说明以 x 为起点不存在一个 y 使得 sum = target,此时要枚举下一个起点,指针 x 向右移动,即 x++;
如果 sum == target 则说明我们找到了以 x 为起点得合法解 [x,y] ,我们需要将 [x,y] 的序列放进答案数组,且我们知道以 x 为起点的合法解最多只有一个,所以需要枚举下一个起点,指针 x 向右移动,即 x++;
classSolution{publicint[][]findContinuousSequence(int target){int i =1;// 滑动窗口的左边界int j =1;// 滑动窗口的右边界int sum =0;// 滑动窗口中数字的和
List<int[]> res =newArrayList<>();//必须要有两个以上的正整数,所以i <= taraet/2while(i <= target /2){if(sum < target){// 右边界向右移动
sum += j;
j++;}elseif(sum > target){// 左边界向右移动
sum -= i;
i++;}else{// 记录结果int[] arr =newint[j-i];for(int k = i; k < j; k++){
arr[k-i]= k;}
res.add(arr);// 左边界向右移动
sum -= i;
i++;}}return res.toArray(newint[res.size()][]);}}