zoukankan      html  css  js  c++  java
  • 剑指:和为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;
        }
    }
  • 相关阅读:
    小波变换的引入,通俗易懂
    Leetcode 437. Path Sum III
    Leetcode 113. Path Sum II
    Leetcode 112 Path Sum
    Leetcode 520 Detect Capital
    Leetcode 443 String Compression
    Leetcode 38 Count and Say
    python中的生成器(generator)总结
    python的random模块及加权随机算法的python实现
    leetcode 24. Swap Nodes in Pairs(链表)
  • 原文地址:https://www.cnblogs.com/lisen10/p/11460402.html
Copyright © 2011-2022 走看看