首页 > 其他分享 >【剑指Offer】41、和为S的连续正数序列

【剑指Offer】41、和为S的连续正数序列

时间:2023-08-23 22:46:41浏览次数:46  
标签:窗口 Offer ArrayList 41 high low 序列 正数

【剑指Offer】41、和为S的连续正数序列

题目描述:

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

输出描述:

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

解题思路:

对于本题,由于是在一个连续序列中连续查找,可以使用类似滑动窗口的思想,使用双指针定位滑动窗口的上下边界,用两个数low和high分别指向当前序列中的最大和最小值,初始low为1,high为2。如果从low到high的序列的和大于给定的S,那么说明可以去掉一个比较小的值,即增大low的值(相当于去掉了一个最小值,窗口收缩)。反之,如果从low到high的序列和小于给定的S,则应该增加一个值,即增大high(相当于窗口扩张,让这个窗口包含更多的值)。这样依次查找就可以找到所有的满足条件的序列,并且符合序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序要求。

另外,需要注意的是:循环的结束条件。由于要求序列至少包含两个数,因此当low追上high或者当low超过S的一半时,即可停止查找。

举例:

编程实现(Java):

import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
       //思路:双指针滑动窗口
        ArrayList<ArrayList<Integer>> res=new ArrayList<>();
        int low=1,high=2; //窗口的初始指针
        int curSum=low+high; //当前窗口中元素之和
        while(low<high && low<(sum+1)/2){ //至少连个元素,左指针追上右指针,或者左指针超过一半停止
            if(curSum==sum){ //相等,说明找到一个序列
                ArrayList<Integer> temp=new ArrayList<>();
                for(int i=low;i<=high;i++)
                    temp.add(i);
                res.add(temp);
                curSum -= low;
                ++low;
            }
            else if(curSum>sum){ //当前和大于sum,左指针右移,减去一个小值
                curSum -= low;
                ++low;
            }else{ //当前和小于sum,右指针右移,加上一个值
                ++high;
                curSum += high;
            }
        }
        return res;
    }
}

标签:窗口,Offer,ArrayList,41,high,low,序列,正数
From: https://www.cnblogs.com/bujidao1128/p/17652946.html

相关文章

  • 【剑指Offer】42、和为S的两个数字
    【剑指Offer】42、和为S的两个数字题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。解题思路:对于本题,比上一题简单一些。看到题目,我们的第......
  • 剑指 Offer 10- I. 斐波那契数列(简单)
    题目:classSolution{//动态规划public:intfib(intn){if(n<=1)returnn;vector<int>dp(2,0);//确定dp数组以及下标的含义dp[0]=0;//dp数组初始化dp[1]=1;for(inti=2;i<=n;i++){//递推顺序从......
  • 剑指 Offer 41. 数据流中的中位数(困难)
    题目:classMedianFinder{//暴力解法:每添加一个数字后用sort进行排序,然后返回中位数,时间复杂度:nlogn,会超时。因此采用**二分法查找并进行插入的方法**。时间复杂度:lognpublic:vector<int>nums;//初始化一个当前数组/**initializeyourdatastructure......
  • Python基础入门学习笔记 041 魔法方法:构造和析构
     __init__(self[,...]) 方法是类在实例化成对象的时候首先会调用的一个方法1>>>classRectangle:2def__init__(self,x,y):3self.x=x4self.y=y5defgetPeri(self):6return(self.x+self.y)*27defgetArea......
  • 剑指 Offer 51. 数组中的逆序对(困难)
    题目:classSolution{//这道题利用了归并排序(分而治之)的思想,就是在每一次排序中统计逆序对的个数public:intmergesort(intl,intr,vector<int>&nums,vector<int>&tmp){//tmp用于记录合并之前的两个子数组if(l>=r)return0;//递归......
  • 2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序
    2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K,返回有多少子序列的最大公约数为K。结果可能很大,对1000000007取模。1<=N<=10^5,1<=arr[i]<=10^5。来自腾讯笔试。来自左程云。答案2023-08-22:算法过程分步描述如下:1.初始化数组dp、cnt和pow2,长度为MAX......
  • 设计原理图:FMC141-四路 250Msps 16bits AD FMC子卡
     一、产品概述:   本板卡基于 FMC 标准板卡,实现 4 路 16-bit/250Msps ADC 功能。遵循 VITA 57 标准,板卡可以直接与xilinx公司或者本公司 FPGA 载板连接使用。板卡 ADC 器件采用 ADI 公司 AD9467 芯片,用户可以通过 FMC 接口配置芯片工作状......
  • 剑指 Offer 45. 把数组排成最小的数(中等)
    题目:classSolution{public:stringminNumber(vector<int>&nums){//这道题要学会重构字符串的比较排序vector<string>str;//将数组全部转化为字符串进行比较stringresult;for(inti=0;i<nums.size();i++){str.p......
  • CF1841F
    原题翻译算是一道很经典的题了,所以决定写博客设最后选出的四种生物个数分别是\(A\),\(B\),\(C\),\(D\),则最后的答案显然是\((A-B)^2+(C-D)^2\)我们不妨把一个生物群\(a_i\),\(b_i\),\(c_i\),\(d_i\)看成向量\((a_i-b_i,c_i-d_i)\),则原题就变成了从\(n\)个向量中选若干个,使得这......
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列(中等)
    题目:结合以下图理解该方法classSolution{//本题要点:二叉搜索树性质:根节点一定大于所有左子树,一定小于所有右子树public:booltraversal(vector<int>&postorder,intl,intr){//l和r分别为当前树的左右边界if(l>=r)returntrue;int......