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

题目描述

输入一个正数 s,打印出所有和为 s 的连续正数序列(至少含有两个数)。

例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以结果打印出 3 个连续序列 1~5、4~6 和 7~8。

样例

输入:15

输出:[[1,2,3,4,5],[4,5,6],[7,8]]

输出描述:

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

 

解法

用两个指针 p, q 指示序列的最小值和最大值。如果序列和大于 s,则从序列中去掉较小的值,即 ++p;如果序列和小于 s,则序列向右再包含一个数字,即 ++q

当 p 超过 s 的一半时,停止。

 

 

import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
       ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        
        if(sum<3){
            return res;
        }
        int p=1, q=2;
        int mid = (1+sum) >> 1;  //
        int curSum = p + q;
        
        while(p < mid){
            
            
            while(curSum > sum && p < mid){
                curSum -= p;
                p++;
                //if(curSum == sum){
               //     res.add(getList(p, q));
               // }
            }
            //这段代码不要上一个while之前,不然会代码重复,而且多了一次判断,效率不高
            if(curSum == sum){
                res.add(getList(p, q));
            }
            
            ++q;
            curSum += q;
        }
        return res;
    }
    
    private ArrayList<Integer> getList(int l, int r){
        ArrayList<Integer> res = new ArrayList<>();
        for(int i=l; i<=r; i++){
            res.add(i);
        }
        return res;
    }
}

 

posted @ 2019-09-04 17:57  亦海  阅读(229)  评论(0编辑  收藏  举报