剑指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的连续正数序列的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-和为s的连续正数序列

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

剑指offer57 和为s的连续正数序列

和为S的连续正数序列——牛客网(剑指offer)

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列

剑指Offer-和为S的连续正数序列