劍指offer系列——和爲S的連續正數序列

題目描述

小明很喜歡數學,有一天他在做數學作業時,要求計算出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;
    }
}

通過截圖

在這裏插入圖片描述

總結

其實這道題我半年前就做過了,然後當時根本對算法沒多少認識,基本都是一個思路“暴力破萬法”,“一切皆可暴”。所以慢慢接觸到一些面經,基本就是算法題你只要是暴力解的基本都是不通過,這就給我提了個醒,不能一直依靠暴力,暴力就當作入門,後面要多學習算法達到一道題有多種解法思路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章