小明很喜歡數學,有一天他在作數學做業時,要求計算出9~16的和,他立刻就寫出了正確答案是100。可是他並不知足於此,他在想究竟有多少種連續的正數序列的和爲100(至少包括兩個數)。沒多久,他就獲得另外一組連續正數和爲100的序列:18,19,20,21,22。如今把問題交給你,你能不能也很快的找出全部和爲S的連續正數序列? Good Luck!java
輸出描述: 輸出全部和爲S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序spa
思路一:code
暴力,時間複雜度過高,確定不合適。get
思路二(滑動窗口):數學
注:等差數列中io
$S(n)=(a1+an)*n/2$class
$n=an-a1+1$import
$S(n)=(a1+an)*(an-a1+1)*n/2$List
package Array; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * 和爲S的連續正數序列 * 小明很喜歡數學,有一天他在作數學做業時,要求計算出9~16的和,他立刻就寫出了正確答案是100。 * 可是他並不知足於此,他在想究竟有多少種連續的正數序列的和爲100(至少包括兩個數)。 * 沒多久,他就獲得另外一組連續正數和爲100的序列:18,19,20,21,22。 * 如今把問題交給你,你能不能也很快的找出全部和爲S的連續正數序列? Good Luck! * 輸出描述: * 輸出全部和爲S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序 */ public class Solution40 { public static void main(String[] args) { Solution40 solution40 = new Solution40(); ArrayList<ArrayList<Integer>> lists = solution40.FindContinuousSequence_2(100); for (ArrayList<Integer> list : lists) { System.out.println(list); } } /** * 等差數列Sn=(a1+an)*n/2 n=an-a1+1 Sn=(a1+an)*(an-a1+1)/2 * 初始化left=1,big=2; * left到right序列和小於sum,right++;大於sum,left++; * 當left增長到(1+sum)/2是中止 * * @param sum * @return */ public ArrayList<ArrayList<Integer>> FindContinuousSequence_2(int sum) { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); if (sum < 3) return result; ArrayList<Integer> list; int left = 1; int right = 2; int total = 0; while (left < right && left < (1 + sum) / 2) { total = (left + right) * (right - left + 1) / 2; if (total == sum) { list = new ArrayList<Integer>(); int temp = left; while (temp <= right) { list.add(temp); temp++; } result.add(list); left++; right++; } else if (total < sum) { right++; } else { left++; } } return result; } /** * 暴力 * * @param sum * @return */ public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> list = new ArrayList<Integer>(); for (int i = 1; i <= sum / 2; i++) { list.add(i); for (int j = i + 1; j <= sum / 2 + 1; j++) { list.add(j); int total = 0; for (int x = 0; x < list.size(); x++) { total += list.get(x); } if (total == sum) { result.add(list); list = new ArrayList<Integer>(); break; } else if (total > sum) { list.clear(); break; } } } return result; } }