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

简介: 图解LeetCode算法

一、题目

输入一个正整数 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,我们来看一下如何进行逻辑操作的,请见下图所示:

四、代码实现

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][]);
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」


相关文章
Leetcode第41题(缺失的第一个正数)
这篇文章介绍了解决LeetCode第41题“缺失的第一个正数”的两种方法:使用哈希表和调整数组元素位置,以实现时间复杂度为O(n)且只使用常数级别额外空间的解决方案。
244 0
Leetcode第41题(缺失的第一个正数)
|
8月前
|
存储 C++ 索引
最长连续序列(每天刷力扣hot100系列)
本题使用哈希表法求最长连续序列。利用unordered_set存储去重元素,遍历集合时仅当num-1不存在时才作为起点向后扩展,统计连续长度,时间复杂度O(n),空间复杂度O(n)。相比unordered_map更高效,因无需存储值。
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
233 6
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
334 4
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
468 1
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
223 4
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
192 3
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
213 3
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
178 2
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
281 0

热门文章

最新文章