劍指Offer--和為s的連續正數序列
阿新 • • 發佈:2018-07-20
solution 範圍 要求 感覺 輸出 enc 需要 元素 arraylist
自己寫的low代碼
和為s的連續正數序列
題目 小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列?
輸出描述 輸出所有和為S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序。
初步思路 劃定範圍首先1~s/2,後來想著根據奇偶數劃分,但是這樣似乎太狹隘。再後來感覺和等差求和有點相似,所以就有下面幾個限定條件:① s=na1+n(n-1)/2;② a1<=s/2; ③ a1>0;④ n>=2;根據以上四個條件進行查找;采用插入排序將其進行序間排序
自己寫的low代碼
import java.util.ArrayList; public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int s) { /* ArrayList<ArrayList<Integer>> list = new ArrayList(); if (s <= 0) { return list; } int a1 = 0; int n = 2; for (;; n++) { a1 = s / n + (1 - n) / 2; if (a1 <= 0 || a1 > s / 2) { break; } int sum = n*a1+n*(n-1)/2; if(sum==s) { ArrayList<Integer> list1= new ArrayList(); for(int i=0;i<n;i++) { list1.add(a1+i); } list.add(list1); } } return list;*/ //上面這種不符合序列建按照開始數字從小到大的順序; ArrayList<ArrayList<Integer>> list = new ArrayList(); if (s <= 0) { return list; } int a1 = 0; int n = 2; for (;; n++) { a1 = s / n + (1 - n) / 2; if (a1 <= 0 || a1 > s / 2) { break; } int sum = n * a1 + n * (n - 1) / 2; if (sum == s) { ArrayList<Integer> list1 = new ArrayList(); for (int i = 0; i < n; i++) { list1.add(a1 + i); } for (int i = 0; i < list.size(); i++) { if (list1.get(0) < list.get(i).get(0)) { list.add(new ArrayList()); //需要添加一個新的元素; for (int j = list.size()-1; j > i; j--) { list.set(j, list.get(j - 1)); } list.set(i, list1); break; } } if(!list.contains(list1)) { list.add(list1); } } } return list; } }
劍指Offer--和為s的連續正數序列