剑指offer:和为S的连续正数序列
Posted zhangxiaoyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer:和为S的连续正数序列相关的知识,希望对你有一定的参考价值。
http://wiki.jikexueyuan.com/project/for-offer/question-forty-one.html
例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以结果打出 3 个连续序列 1~5、4~6 和 7~8
考虑用两个数 small 和 big 分别表示序列的最小值和最大值。
首先把 small 初始化为 1,big 初始化为 2。
如果从 small 到 big 的序列的和大于 s,我们可以从序列中去掉较小的值,也就是增大 small 的值。
如果从 small 到 big 的序列的和小于 s,我们可以增大 big,让这个序列包含更多的数字。
因为这个序列至少要有两个数字,我们一直增加 small 到(1+s)/2 为止。
以求和为 9 的所有连续序列为例,我们先把 small 初始化为 1,big 初始化为 2。
此时介于 small 和 big 之间的序列是{1,2},序列的和为 3,小于 9,所以我们下一步要让序列包含更多的数字。我们把 big 增加 1 变成 3,此时序列为{I, 2,3}。
由于序列的和是 6,仍然小于 9,我们接下来再增加 big 变成 4,介于 small 和 big 之间的序列也随之变成{ l, 2, 3, 4}
。由于列的和 10 大于 9,我们要删去去序列中的一些数字, 于是我们增加 small 变成 2,此时得到的序列是{2, 3, 4},序列的和E好是 9。
我们找到了第一个和为 9 的连续序列,把它打印出来。
接下来我们再增加 big及small,重复前面的过程,可以找到第二个和为 9 的连续序列{4,5}。
public java.util.ArrayList<java.util.ArrayList<Integer>> FindContinuousSequence(int sum) { java.util.ArrayList<java.util.ArrayList<Integer>> list = new ArrayList<java.util.ArrayList<Integer>>(); if(sum==1){ java.util.ArrayList<Integer> data = new java.util.ArrayList<Integer>(); data.add(1); list.add(data); } if(sum==2){ java.util.ArrayList<Integer> data = new java.util.ArrayList<Integer>(); data.add(2); list.add(data); } int middle = (sum+1)/2; int after =1; int before =2; int total=0; while(after<=middle){ for(int i=after;i<=before;i++){ total += i; } if(total==sum){ java.util.ArrayList<Integer> data = new java.util.ArrayList<Integer>(); for(int i=after;i<=before;i++){ data.add(i); } list.add(data); after++; before++; }else if(total>sum){ after++; }else if(total<sum){ before++; } } return list; }
以上是关于剑指offer:和为S的连续正数序列的主要内容,如果未能解决你的问题,请参考以下文章