題目描述
小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和爲100(至少包括兩個數)。沒多久,他就得到另一組連續正數和爲100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找到所有和爲S的連續正數序列?Good Luck!
輸出描述
輸出所有和爲S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序
暴力思路
就是正常的暴力解法,窮舉所有可能相加等於S,本文章不講這個解法。
雙指針思路
設置兩個指針left和right,然後根據等差數列的求和公式(a0+an)* n / 2求出對應的和與S比較,等於的話直接返回;小於S的話就right++;大於S的話就left++。
代碼
package nowcoder;
import java.util.ArrayList;
/**
* @author god-jiang
* @date 2020/2/4 11:35
*/
public class FindContinuousSequence {
public ArrayList<ArrayList<Integer>> findContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
//設置兩個指針left和right
int left = 1;
int right = 2;
while (left < right) {
//因爲都是連續的,差值爲1的等差數列。
//求和公式爲(a0+an)*n/2
int curSum = (left + right) * (right - left + 1) / 2;
//判斷curSum和sum的大小關係調整對應的left和right
if (curSum == sum) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = left; i <= right; i++) {
list.add(i);
}
res.add(list);
left++;
} else if (curSum < sum) {
right++;
} else {
left++;
}
}
return res;
}
}
通過截圖
總結
其實這道題我半年前就做過了,然後當時根本對算法沒多少認識,基本都是一個思路“暴力破萬法”,“一切皆可暴”。所以慢慢接觸到一些面經,基本就是算法題你只要是暴力解的基本都是不通過,這就給我提了個醒,不能一直依靠暴力,暴力就當作入門,後面要多學習算法達到一道題有多種解法思路。