• 剑指:和为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;
        }
    }
  • 相关阅读:
    图论算法——最短路系列
    1126 数字统计 2010年NOIP全国联赛普及组
    JavaEE Tutorials (10)
    情书
    洛谷 P1171 售货员的难题
    洛谷 P1769 淘汰赛制_NOI导刊2010提高(01)
    洛谷 P1858 多人背包
    HDU 2639 Bone Collector II
    国庆 day 6 下午
    国庆 day 6 上午
  • 原文地址:https://www.cnblogs.com/lisen10/p/11460402.html
Copyright © 2020-2023  润新知