题目

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

思路1(双指针/滑动窗口)

  • 所谓滑动窗口,就是需要我们从一个序列中找到某些连续的子序列,我们可以使用两个for循环来遍历查找,但是未免效率太低了。因此我们可以用一个窗口,从左到右只需要遍历一次,然后每次判断当前窗口是否满足条件,不满足就扩大窗口或者缩小窗口,当滑动窗口从左边滑动到了右边,就可以得到最优解了。
  • 滑动窗口的左边界和右边界都只能向右移动,因此只遍历一遍数组,从而时间复杂度是\(O(N)\)
  • 该题要求是待遍历的序列是从1~target可构建一个滑动窗口从左向右滑动,窗口边界为leftright,初始的时候left=left=1
  • 窗口的有效范围就是窗口左边界要小于右边界,即left < right
  • 每次循环中,将窗口里面的数字的总和sumtarget进行比较:
    • 如果target > sum,说明窗口大了,需要将当前leftsum中删除,同时left右移一步
    • 如果target < sum,说明窗口笑了,需要将当前rightsum中删除,同时right右移一步
    • 如果target = sum,则找到一段序列等于target,记录下该子序列,同时left向右移动一步
  • 我们以target=9为例,求解流程如下:

代码

class Solution {
public int[][] findContinuousSequence(int target) {
int sum = 3;
int left = 1;
int right = 2;
List<int[]> res = new ArrayList<>(); while (left < right) {
// 当前窗口符合要求
if (sum == target) {
// 加入到结果集中
int[] temp = new int[right - left + 1];
for (int i = left; i <= right; i++) {
temp[i-left] = i;
}
res.add(temp);
} // 窗口过大,要缩小窗口
if (sum >= target) {
// 这里要先将left从sum中减去,然后再右移一位,因为当前left是即将被移出窗口,这样才能保证left是窗口的左边界
sum -= left;
left++;
} else if (sum < target) {
// 这里要先将right自增,然后将right加入到sum中,因为先自增才能获取到窗口后一位的元素,然后加入到窗口中,保证了right是窗口的右边界
right++;
sum += right;
}
}
return res.toArray(new int[res.size()][]);
}
}

复杂度分析

  • 时间复杂度:\(O(N)\),其中N=target
  • 空间复杂度:\(O(1)\)

力扣 - 剑指 Offer 57 - II. 和为s的连续正数序列的更多相关文章

  1. 剑指 Offer 57 - II. 和为s的连续正数序列 + 双指针 + 数论

    剑指 Offer 57 - II. 和为s的连续正数序列 Offer_57_2 题目描述 方法一:暴力枚举 package com.walegarrett.offer; /** * @Author W ...

  2. 剑指 Offer 57 - II. 和为s的连续正数序列

    本题 题目链接 题目描述 我的题解 方法三双100%, 方法一 适合范围广 方法一:双指针(也叫 滑动窗口) 思路分析 用两个指针i和表示当前枚举到的以i为起点,j为终点的区间,sum表示[i,j]的 ...

  3. 力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字

    题目 剑指 Offer 53 - II. 0-n-1中缺失的数字 思路1 排序数组找数字使用二分法 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字 一旦不相等了, ...

  4. 力扣 - 剑指 Offer 57. 和为s的两个数字

    题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...

  5. 力扣 - 剑指 Offer 55 - II. 平衡二叉树

    题目 剑指 Offer 55 - II. 平衡二叉树 思路1(后序遍历+剪枝) 这题是上一题剑指 Offer 55 - I. 二叉树的深度的进阶,逻辑代码和那个一样,也是后续遍历,获取两个子节点较大的 ...

  6. 剑指offer四十一之和为S的连续正数序列

    一.题目   题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数 ...

  7. LeetCode 题解 | 面试题57 - II. 和为s的连续正数序列

    题目描述 面试题57 - II. 和为s的连续正数序列 难度简单37收藏分享切换为英文关注反馈 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内 ...

  8. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  9. 刷题-力扣-剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de- ...

随机推荐

  1. 浅谈一种浮标浮岛式水质监测“智能哨兵”助力水质监测,多环境应用ke轻松测水!

    浮岛式水质监测站能够在实际使用中,安装方便,能够采集多种参数,溶解氧  氨氮  电导率  盐分 pH值  COD  水位  节省时间和人工,浮标水质监测站是设立在河流.湖泊.水库.近岸海域等流 域内的 ...

  2. Gotop安装

    一个方便的图形面板 Github:https://github.com/cjbassi/gotop 安装 git clone --depth 1 https://github.com/cjbassi/ ...

  3. Mysql backup and Recovery Data Type.

    数据库备份方法: 备份类型:物理备份和逻辑备份: 物理备份是指直接复制存储数据库内容的目录和文件,这种类型的备份适用于出现问题时需要快速恢复的大型重要数据库.逻辑备份保存以逻辑数据库结构(create ...

  4. PHP中的IMAP扩展简单入门

    对于邮件处理来说,大家比较熟悉的应该是 POP3 . SMTP 这类的协议,而今天我们介绍的 IMAP 其实也是非常常用的一种邮件处理协议.它和 POP3 比较类似,都是以接收处理邮件为主.不过相对于 ...

  5. composer出现问题: Could not open input file: composer.phar

    可以执行下面命令 php -r "readfile('https://getcomposer.org/installer');" | php This will install c ...

  6. CURL的模拟登录和抓取页面

    <?php $curl = curl_init();// 初始化 // 准备提交的表单数据之账号和密码.(这个是根据表单选项来的) $data = "_username=6049892 ...

  7. Python中Tk模块简单窗口设计

    Python中Tk和PyQt都可以设计小程序,区别在于:Tk界面美观度相对较差,但由于是Python的内置模块,最终生成的程序大小相比于PyQt较小. import tkinter # 导入TKint ...

  8. 几分钟就能学会的Python虚拟环境教程

    什么是虚拟环境 我们在使用Python的时候,通常用pip来进行包管理.比如我们要安装一个叫requests的库,那么我们就会采用以下命令去安装: pip install requests 那你知道, ...

  9. 数据库管理软件navicate12的激活和安装

    前言   太多做测试或开发的小伙伴需要写sql语句,激活版navicat版本它来了 准备软件 navicat12安装包 navicat注册机 百度网盘下载链接(永久有效): 链接:https://pa ...

  10. LaTeX Vscode 配置

    安装:https://www.latexstudio.net/archives/51801.html LaTeX 安装 & 宏包升级 & 入门:https://blog.csdn.ne ...