和为s的连续正数序列(滑动窗口)

题目要求得出和为s的所有连续整数序列。

想法:双指针形成滑动窗口,时刻记录双指针间的和。
当和与目标值相同,则将双指针间的数据记录下来,并且将左指针右移。
当和大于目标值,则将左指针右移(将和减小),且和需要减小原左指针值。
当和小于目标值,则将右指针右移(将和增大),且和需要减小原右指针值。

public int[][] findContinuousSequence(int target) {
        int i = 1;
        int j = 2;
        int sum = 3;
        List<int[]> res = new ArrayList<>();
        while (i < j) {
            if (sum == target) {
                int[] tmp = new int[j - i + 1];
                for (int k = i; k < j; k++) {
                    tmp[k - i] = k;
                }
                res.add(tmp);
            }
            if (sum >= target) {
                sum -= i;
                i++;
            } else {
                sum += ++j;
            }
        }
        return res.toArray(new int[0][]);
    }

注:
用于记录结果的数组,因为无法知道有多少个解,且每个解包含的数个数也不同,所以无法申请固定空间存储,故申请一个列表,每个元素是一个未定大小的数组存结果。

当找到解,解所包含的元素个数为右指针-左指针+1.
申请好数组后,从左指针开始遍历,以此给结果数组赋值即可。
最后返回一个由结果列表转成的一行,列不定的数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔幻音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值