前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图解LeetCode——剑指 Offer 57 - II. 和为s的连续正数序列

图解LeetCode——剑指 Offer 57 - II. 和为s的连续正数序列

作者头像
爪哇缪斯
修改2023-07-13 22:57:40
1250
修改2023-07-13 22:57:40
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯

一、题目

输入一个正整数 target ,输出所有和为 target连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列

二、示例

2.1> 示例 1:

输入】target = 9 【输出】[[2,3,4],[4,5]]

2.2> 示例 2:

输入】target = 15 【输出】[[1,2,3,4,5],[4,5,6],[7,8]]

限制:

  • 1 <= target <= 10^5

三、解题思路

根据题目描述,我们可以获得一个非常重要的信息,即:连续正整数序列;那么,我们就可以较为容易的想到采用“滑动窗口”方式进行解题。因为滑动窗口解题的特性就是连续元素进行统计之类的操作。

既然我们要采用滑动窗口进行解题,我们首先默认创建两个指针,即:指向窗口最前端的head指针,它的默认值为1;以及指向窗口最后端的tail指针,它的默认值为2

由于我们已经确定了head等于1tail等于2,那么我们创建sum变量,用于记录滑动窗口中所有元素之和,它的默认值就是head+tail等于3;

随后,我们就可以进行窗口的滑动操作了,具体操作规则如下所示:

如果sum < target】我们就扩大窗口,执行tail++,并更新sum值(sum加上tail值); 【如果sum > target】我们就缩小窗口,更新sum值(sum减去head值),执行head++; 【如果sum == target】表示我们到了符合条件的数字集合。然后,执行head++;

head等于tail的时候,就可以终止窗口滑动操作了。为什么是这样呢?我们假设窗口里只有45target等于9,那么满足条件后,我们需要将数字4踢出窗口,并增加数字6,那么此时我们发现,窗口里存在56了,大于target,并且后续无论怎么滑动,窗口内的元素之和都是大于9的(题目要求窗口内至少含有两个数)。

解题思路就是这些了,为了便于理解,我们还是举一个例子,例如:target=9,我们来看一下如何进行逻辑操作的,请见下图所示:

四、代码实现

代码语言:javascript
复制
class Solution {
    public int[][] findContinuousSequence(int target) {
        List<int[]> result = new ArrayList();
        int head = 1, tail = head + 1, sum = head + tail;
        while(head != tail) {
            if (sum < target) sum += ++tail; // 滑动窗口外扩
            else if (sum > target) sum -= head++; // 滑动窗口内收
            else {
                int[] res = new int[tail - head + 1];
                for (int i = head, index = 0; i <= tail; i++) res[index++] = i;
                result.add(res);
                sum -= head++; // 滑动窗口内收
            }     
        }
        return result.toArray(new int[0][]);
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.1> 示例 1:
  • 2.2> 示例 2:
  • 限制:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档