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;
    }
}
posted @ 2025-06-01 10:00  回忆、少年  阅读(7)  评论(0)    收藏  举报