码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-08-28 23:56:04      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:lis   question   util   list   之间   序列   nbsp   连续   初始化   

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的连续正数序列

标签:lis   question   util   list   之间   序列   nbsp   连续   初始化   

原文地址:http://www.cnblogs.com/joshsung/p/7442075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!