劍指offer:和為S的連續正數序列
阿新 • • 發佈:2017-08-28
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的連續正數序列