题目描述:

  小明很喜欢数学,有一天他在做数学作业时,要求计算出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;
}
}

最新文章

  1. Codrops 优秀教程:CSS 3D Transforms 实现书本效果
  2. C语言实现单链表-01版
  3. 图像特征提取之(一)HOG特征
  4. NeHe OpenGL教程 第二十九课:Blt函数
  5. android Notification和NotificationManager的使用
  6. sass学习(2)——关于变量
  7. Mongodb 安装 以及 问题解决-摘自网络
  8. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
  9. Codechef Nuclear Reactors 题解
  10. vue vuex 提交 this.$store.commit({type: &#39;setSelectPro&#39;, selectPro: this.productId});
  11. 如果没有UX经验,如何创建个人UX作品集?
  12. Beta项目总结
  13. 【STM32H7教程】第13章 STM32H7启动过程详解
  14. 补充照片:某基同学使用Bing词典
  15. Kafka与常见消息队列的对比
  16. spring mvc开发过程中的乱码问题
  17. windows 远程连接
  18. Oracle Applications Documentation
  19. C#防止WebBrowser在新窗口中打开链接页面
  20. bzoj3258秘密任务

热门文章

  1. Oracle Internals 相关站点
  2. 微信小程序的小问题(1)
  3. javaEE之--------统计站点在线人数,安全登录等(观察者设计模式)
  4. Facebook图搜索unicorn
  5. Swift基础(类,结构体,函数)
  6. arm下用shell控制gpio
  7. [python基础] Flasky-表单WTForms支持的html字段和内建函数
  8. Section %post does not end with %end
  9. 0522 json
  10. 题解 UVA10587 【Mayor&#39;s posters】