题目描述:

  小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

  输出描述:

  输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。

  解题思路:

  对于本题,由于是在一个连续序列中连续查找,可以使用类似滑动窗口的思想,使用双指针定位滑动窗口的上下边界,用两个数low和high分别指向当前序列中的最大和最小值,初始low为1,high为2。如果从low到high的序列的和大于给定的S,那么说明可以去掉一个比较小的值,即增大low的值(相当于去掉了一个最小值,窗口收缩)。反之,如果从low到high的序列和小于给定的S,则应该增加一个值,即增大high(相当于窗口扩张,让这个窗口包含更多的值)。这样依次查找就可以找到所有的满足条件的序列,并且符合序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序要求。

  另外,需要注意的是:循环的结束条件。由于要求序列至少包含两个数,因此当low追上high或者当low超过S的一半时,即可停止查找。

  举例:

![](https://img2018.cnblogs.com/blog/1608161/201905/1608161-20190511112523257-1249678917.png)

  **编程实现(Java):**

import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
//思路:双指针滑动窗口
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
int low=1,high=2; //窗口的初始指针
int curSum=low+high; //当前窗口中元素之和
while(low<high && low<(sum+1)/2){ //至少连个元素,左指针追上右指针,或者左指针超过一半停止
if(curSum==sum){ //相等,说明找到一个序列
ArrayList<Integer> temp=new ArrayList<>();
for(int i=low;i<=high;i++)
temp.add(i);
res.add(temp);
curSum -= low;
++low;
}
else if(curSum>sum){ //当前和大于sum,左指针右移,减去一个小值
curSum -= low;
++low;
}else{ //当前和小于sum,右指针右移,加上一个值
++high;
curSum += high;
}
}
return res;
}
}

【剑指Offer】41、和为S的连续正数序列的更多相关文章

  1. 剑指Offer 41. 和为S的连续正数序列 (其他)

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

  2. [剑指Offer] 41.和为S的连续正数序列

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

  3. 【剑指Offer】和为S的连续正数序列 解题报告(Python)

    [剑指Offer]和为S的连续正数序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...

  4. 【剑指offer】和为定值的连续正数序列

    .可是他并不满足于此,他在想到底有多少种连续的正数序列的和为100(至少包含两个数).没多久,他就得到还有一组连续正数和为100的序列:18,19,20,21,22.如今把问题交给你,你能不能也非常快 ...

  5. 《剑指offer》和为S的连续正数序列

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  6. Go语言实现:【剑指offer】和为S的连续正数序列

    该题目来源于牛客网<剑指offer>专题. 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数 ...

  7. 剑指offer系列46---和为s的连续正数序列

    [题目]输出所有和为S的连续正数序列.序列为:1,2,3,4,5,6,7,8................ * 序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 package com.e ...

  8. 【剑指offer】 和为s的连续正数序列,C++实现

    原创博文,转载请注明出处! # 题目 # 思路 设置两个辅助变量small和big,small表示序列的最小值,big表示序列的最大值.如果sum(small ~ big) > s,则增大sma ...

  9. 【剑指offer】和为S的连续正数序列

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

  10. 剑指offer:和为S的连续正数序列

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

随机推荐

  1. backup script

    #!/bin/bash ##################################################### # export the whole database use ex ...

  2. [Vue] Lazy Load a Route by using the Dynamic Import in Vue.js

    By default, vue-router doesn’t lazy load the routes unless you tell it to do it. Lazy loading of the ...

  3. erlang Unicode 处理

    最近在使用erlang做游戏服务器,而字符串在服务器编程中的地位是十分重要的,于是便想仔细研究下字符编码,以及erlang下的字符串处理.先从Unicode开始吧.... [Unicode] Unic ...

  4. centos下配置防火墙port失败

    问题:将规则加入到防火墙中.总是port无法开启 (1)改动文件 首先vim /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp ...

  5. 欣喜若狂!今天最终成功把音频导入到iphone了,大半年的努力,靠的毅力和方法

    研究IOS 的助手也有大半年时间了,一直没有实现导入音视频文件的功能,主要是过程太复杂,而且基本上没有资料能够查询.经过不懈的努力,今天最终成功导入了一个mp3 文件到ipod,一切功能正常,期间经历 ...

  6. 杂项-Java:标签库

    ylbtech-杂项-Java:标签库 1.返回顶部 1. JSP标签库,也称自定义标签库,可看成是一种通过JavaBean生成基于XML的脚本的方法.从概念上讲,标签就是很简单而且可重用的代码结构. ...

  7. 关于MFC控件删除出现“具有该ID的控件已存在”这样的情况的解决方案,详细,网上都没有这么详细的,我是“深受其害”,所以想将详细的方法分享出去。

    网上关于MFC控件删除出现“具有该ID的控件已存在”这样的情况,在网上找了很多关于这方面的东西,但是都不是很全,也不容易弄明白.现在问我直接通过一个项目和图片的形式和大家一块分享一个这个解决方法(如有 ...

  8. js开发规范,在php上也适用

    本篇主要介绍JS的命名规范.注释规范以及框架开发的一些问题. 目录 1. 命名规范:介绍变量.函数.常量.构造函数.类的成员等等的命名规范 2. 注释规范:介绍单行注释.多行注释以及函数注释 3. 框 ...

  9. IntelliJ IDEA/PyCharm/WebStorm 2019.1.2 注册码激活

    [IDEA2019.1.2最新版版本激活,直接查看底部] 网上IntelliJ IDEA激活方式大多均已失效,目前常用激活方式为License Server 激活: http://idea.imsxm ...

  10. [BZOJ1601] 灌水

    难点:找到正确方式建图 知识点:Kruskal 分析:这种题肯定要把点权转换到边权上,但肯定无法搞到和其他点相连的边上,怎么办呢?那就再造一个点呗,这个“超级点”和所有点相连,且边权=点权,于是就可以 ...