1. 程式人生 > >和為S的連續正數序列——牛客網(劍指offer)

和為S的連續正數序列——牛客網(劍指offer)

http cti code 題目 作業 OS enc www. count-1

題目描述

    小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck!

輸出描述:

    輸出所有和為S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序

題目鏈接 https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tqId=11194&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路一:

設置startNum,endNum,初值分別為1,2
startNum暫時固定,endNum往後移動,計算[startNum,endNum]之間的數值和sum。當sum等於S,做記錄;當sum>S,跳出裏層循環。startNum後移一位,在執行上述過程。startNum取值範圍一般定為1~S/2。

思路二:

利用等差數列的求和公式

sum = a1*n + n*(n-1)*d/2

由題意可知,相鄰項之差為1,即d=1;

sum = a1*n + n*(n-1)*/2

又可知a1≥1;所以

    sum > n + n*(n-1)*/2

===> 2sum > n^2 + n

===> 2sum > n^2

===> n < sqrt(2sum)



public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
    ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
    
    int maxCount = (int) (Math.sqrt(sum * 2.0)+1);
    while (maxCount > 1) {
        int markNum = sum - maxCount * (maxCount-1) / 2;
        
        if ( markNum > 0 && markNum % maxCount == 0 ) {
            int index = maxCount;
            int start = markNum / maxCount;
            ArrayList<Integer> list = new ArrayList<Integer>();
            while (index > 0){
                list.add(start);
                start++;
                index--;
            }
            lists.add(list);
        }
        
        maxCount--;
    }
    return lists;

}

和為S的連續正數序列——牛客網(劍指offer)