• 剑指:和为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;
        }
    }
  • 相关阅读:
    区间覆盖(线段树)
    差分约束
    二维数组
    P1195 口袋的天空
    dp的刷表法和填表法
    P1284 三角形牧场
    数据库课程设计
    具体解释VB中连接access数据库的几种方法
    android之PackageManager简单介绍
    Oracle fga审计有这几个特性
  • 原文地址:https://www.cnblogs.com/lisen10/p/11460402.html
Copyright © 2020-2023  润新知