剑指offer四十一之和为S的连续正数序列

一、题目

   题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

     输出描述:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

二、思路

  双指针问题。当总和小于sum,大指针继续+,否则小指针+。详解代码。

三、代码

import java.util.ArrayList;


public class Solution {
    public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {

        ArrayList<ArrayList<Integer>> arrayList = new ArrayList<ArrayList<Integer>>();

        int phigh = 2, plow = 1;

        while (phigh > plow) {
            int curSum = (phigh + plow) * (phigh - plow + 1) / 2; //求序列的和
            if (curSum < sum)
                phigh++;
            if (curSum == sum) {
                ArrayList<Integer> arrayListTemp=new ArrayList<Integer>();
                for (int i = plow; i <= phigh; i++){
                    arrayListTemp.add(i);
                }
                arrayList.add(arrayListTemp);
                plow++;
            }

            if (curSum > sum)
                plow++;
        }

        return arrayList;
    }
}
View Code

---------------------------------------------

参考链接:

https://www.nowcoder.com/questionTerminal/c451a3fd84b64cb19485dad758a55ebe

posted @ 2017-10-12 22:06  hezhiyao  阅读(...)  评论(...编辑  收藏