【剑指Offer】41、和为S的连续正数序列
题目描述:
小明很喜欢数学,有一天他在做数学作业时,要求计算出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的一半时,即可停止查找。
举例:
**编程实现(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的连续正数序列的更多相关文章
- 剑指Offer 41. 和为S的连续正数序列 (其他)
		题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ... 
- [剑指Offer] 41.和为S的连续正数序列
		题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ... 
- 【剑指Offer】和为S的连续正数序列 解题报告(Python)
		[剑指Offer]和为S的连续正数序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ... 
- 【剑指offer】和为定值的连续正数序列
		.可是他并不满足于此,他在想到底有多少种连续的正数序列的和为100(至少包含两个数).没多久,他就得到还有一组连续正数和为100的序列:18,19,20,21,22.如今把问题交给你,你能不能也非常快 ... 
- 《剑指offer》和为S的连续正数序列
		本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结: 
- Go语言实现:【剑指offer】和为S的连续正数序列
		该题目来源于牛客网<剑指offer>专题. 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数 ... 
- 剑指offer系列46---和为s的连续正数序列
		[题目]输出所有和为S的连续正数序列.序列为:1,2,3,4,5,6,7,8................ * 序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 package com.e ... 
- 【剑指offer】 和为s的连续正数序列,C++实现
		原创博文,转载请注明出处! # 题目 # 思路 设置两个辅助变量small和big,small表示序列的最小值,big表示序列的最大值.如果sum(small ~ big) > s,则增大sma ... 
- 【剑指offer】和为S的连续正数序列
		题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ... 
- 剑指offer:和为S的连续正数序列
		题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久, ... 
随机推荐
- MOS文章翻译
			http://blog.csdn.net/column/details/msdnchina.html?&page=1 http://blog.csdn.net/staricqxyz/artic ... 
- TCP学习(3)--TCP释放连接的过程(四次挥手)
			一.TCP释放连接的过程(四次挥手) TCP释放连接的步骤例如以下图所看到的. 如今如果clientA和server端B都处于数据传送状态. TCP连接断开的过程例如以下: 1.clien ... 
- [Cypress] Create True end-to-end Tests with Cypress (Smoke test)
			Integration tests let us keep our tests fast and reliable. They also allow us to test scenarios that ... 
- 技术总结--android篇(四)--工具类总结
			StringUtil(视个人须要进行加入) public class StringUtil { public static boolean isMail(String string) { if (nu ... 
- 使用SetTimer函数为Delphi的Win控件设置时钟
			procedure Timertodo(var messag:Tmessage);message WM_TIMER; procedure TForm1.FormCreate(Sender: TObje ... 
- luogu2085 最小函数值
			题目大意 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x,Ai,Bi,Ci∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个. ... 
- ningbooj--1655--木块拼接(贪心)
			 [1655] 木块拼接 时间限制: 1000 ms 内存限制: 65535 K 问题描述 好奇的skyv95想要做一个正方形的木块,现在有三种颜色的矩形木块,颜色分别为"A" ... 
- 杂项:ESB接口
			ylbtech-杂项:ESB接口 ESB全称为Enterprise Service Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物.ESB提供了网络中最基本的连接中枢, ... 
- python关于文件的操作
			总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ... 
- PCB MS SQL 将字符串分割,并指定索引返回字符串(标量函数)
			Create FUNCTION [dbo].[SplitIndex] ( @str AS VARCHAR(max), @Index AS INT, ) = '/' ) ) AS BEGIN ) --待 ... 
