剑指Offer-和为S正数序列

和为S正数序列

题目

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

思路

双指针,一大一小,算总和,大了就小的+1.小了就大的+1

代码

public class FindContinuousSequence {
    public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        int pHigh = 2;
        int pLow = 1;
        while (pHigh>pLow){
            int cur = (pHigh + pLow)*(pHigh-pLow+1)/2;//计算和s
            if (cur<sum){
                pHigh++;//拉大值s
            }

            if (cur==sum){
                ArrayList<Integer> path = new ArrayList();
                for (int i=pLow;i<=pHigh;i++){
                    path.add(i);
                }
                res.add(path);
                pLow++;
            }
            if (cur>sum){
                pLow++;
            }
        }
        return res;
    }
}
0%