和为S的连续正数序列——牛客网(剑指offer)

Posted wtting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了和为S的连续正数序列——牛客网(剑指offer)相关的知识,希望对你有一定的参考价值。

题目描述

    小明很喜欢数学,有一天他在做数学作业时,要求计算出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)的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer和为S的连续正数序列

剑指offer-和为s的连续正数序列

剑指offer 和为S的连续正数序列

剑指offer57 和为s的连续正数序列

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列

剑指Offer-和为S的连续正数序列