[每日算法 - 华为机试] 剑指 Offer 57 - II. 和为s的连续正数序列 「滑动窗口」

入口

力扣https://leetcode.cn/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/

题目描述

输入一个正整数 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

方法一:滑动窗口

        解题思路: 用两个指针代表窗口的左右边界,指针移动代表窗口滑动,记录窗口内的数字和sum,窗口滑动同时更改sum。

class Solution {
    public int[][] findContinuousSequence(int target) {
        int i = 1;//左指针
        int j = 1;//右指针
        int sum = 0;
        List<int[]> res = new ArrayList<>();
        while(i <= target/2){
            if(sum < target){
                //和小,右边界右移
                sum+=j;
                j++;
            }else if(sum > target){
                //左边界右移
                sum-=i;
                i++;
            }else{
                //记录结果
                int[] arr = new int[j-i];
                for(int z = i;z < j;z++){
                    arr[z-i] = z;
                }
                res.add(arr);
                //左边界右移
                sum -= i;
                i++;
            }
        }
        return res.toArray(new int[res.size()][]);
    }
}

 

posted @ 2023-07-12 15:13  yihuiComeOn  阅读(18)  评论(0)    收藏  举报  来源