1. 程式人生 > >劍指offer:和為S的連續正數序列

劍指offer:和為S的連續正數序列

java fin off cnblogs 例如 最大 求和 util else

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的連續正數序列