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

ST7789P3初始化配置 【代码】ST7789P3初始化配置。 阅读详情

题目描述

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

输出描述:

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

思路一:数学方法

1)由于我们要找的是和为S的连续正数序列,因此这个序列是个公差为1的等差数列,而这个序列的中间值代表了平均值的大小。
    假设序列长度为n,那么这个序列的中间值可以通过(S / n)得到,知道序列的中间值和长度,也就不难求出这段序列了。

2)满足条件的n分两种情况:
    n为奇数时,序列中间的数正好是序列的平均值,所以条件为:(n & 1) == 1 && sum % n == 0;
    n为偶数时,序列中间两个数的平均值是序列的平均值,而这个平均值的小数部分为0.5,所以条件为:(sum % n) * 2 == n.

 3)由题可知n >= 2,那么n的最大值是多少呢?我们完全可以将n从2到S全部遍历一次,但是大部分遍历是不必要的。为了让n尽可能大,我们让序列从1开始,
 根据等差数列的求和公式:S = (1 + n) * n / 2,得到n<根号2s

说明:

对于偶数情况的判断,因为当序列长度为偶数时,序列的平均值是中间两个数的平均值,且会出现0.5,说明余数是除数的一半,所以可以通过(sum%n)*2==n来进行判断。

而找到了序列的长度和中间值,怎么把这个序列加入到list中,就是要通过最里面的循环,我们知道序列的长度为n,序列的中间值为sum/n,那么sum/n往前推(n-1)/2(及序列长度的一半),此时对应的数就是序列开始的位置。

import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
       ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
        for (int n = (int)Math.sqrt(2*sum); n>=2; n--) {//n为序列长度
            if(((n&1)==1)&&sum%n==0||(sum%n)*2==n){
                //1)比如4,5,6,7,这4个数的和是22,平均值是5.5(小数部分为0.5,说明余数是除数的一半);
                //(2)sum / n是序列的中间值,往前推(n - 1) / 2就是起始值
                ArrayList<Integer> list=new ArrayList<>();
                for (int j = 0,k=(sum/n)-(n-1)/2; j < n; j++,k++) {
                    list.add(k);
                }
                res.add(list);
            }
             
        }
        return res;
              
    }
}

思路二:双指针的思想

设置两个指针,相当于动态窗口的两边,根据窗口内的值的和来确定窗口的位置和大小。

连续的,差为1的序列,求和公式为(a0+an)*n/2

实现:

import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
        ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();//存放结果
        int low=1,high=2;
        while(low<high){
            //差为1 的等差序列的求和公式,s=(a0+an)*n/2
            int currSum=(low+high)*(high-low+1)/2;
            //若当前和与目标值相等,则添加进结果集
            if(currSum==sum){
                ArrayList<Integer> sublist=new ArrayList<>();
                for(int i=low;i<=high;i++){
                    sublist.add(i);
                }
                res.add(sublist);
                low++;
            }else if(currSum>sum){
                //当前和大于目标值,左窗口右移
                low++;
            }else{
                //当前和小于目标值,右窗口右移
                high++;
            }
        }
        return res;
    }
}

 

实现2:不如上一种的思路简单

设置2个指针,1个指向当前序列最小的数,1个指向序列最大的数
1.设置2个指针,一个为small,指向当前正数序列中最小的数,一个为big,指向当前正数序列中最大的数
2.若当前正数序列之和大于s,则缩小序列范围,让small指针不断往前,直到等于s停止。
3.若当前正数序列之和小于s,则扩大序列范围,让big指针不断往前,直到等于s停止。
 注意点:设置mid变量,赋值为(1+s)/2,因为和为s的序列至少包含2个数,所以small要小于s的一半。

import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
        ArrayList<ArrayList<Integer>> list=new ArrayList<ArrayList<Integer>>();
        if(sum<3){
            return list;
        }
        int small=1;//指向正数序列中最小的数
        int big=2;//指向正数序列中最大的数
        int mid=(sum+1)/2;//序列之和为sum至少包含2个数,因此small<mid
        int cursum=small+big;//当前序列总和
        //当small比mid小时,退出循环
        while(small<mid){
            //当前序列和大于sum,则缩小序列范围
            while(cursum>sum&&small<mid){
                cursum=cursum-small;
                small++;
            }
            //当前序列和等于sum,则加入list
            if(cursum==sum){
                ArrayList<Integer> sublist=new ArrayList<Integer>();
                add(sublist,small,big);
                list.add(sublist);
            }
            //当前序列和小于sum,则扩大序列范围
            big++;
            cursum=cursum+big;
        }
       return list;
    }
    private void add(ArrayList<Integer> list,int small,int big){
        for(int i=small;i<=big;i++){
            list.add(i);
        }
    }
}

参考:

https://www.nowcoder.com/questionTerminal/c451a3fd84b64cb19485dad758a55ebe  左神思路

Labwindows CVI写上位机与STM32下位机通信(二) 接着上篇,这篇主要谈谈流量计数据读取。我们使用的MEMS流量计采用Modbus协议Modbus 使用RS-485 作为硬件载体。 一. Modbus协议   该协议定义了 Modbus 总线Master(主设备)与Slave(从设备)之间的通讯报文格式,对于主设备来说,Modbus 协议是联系上位机(如PC、PLC、HMI 等)的接口,而且所有的通讯都是“透明的”。控制器通信使用主-从技术,即 阅读详情

相关推荐

Visual MODFLOW Flex 6.1新手入门:从数据导入到3D建模的完整工作流解析

本文为Visual MODFLOW Flex 6.1新手提供了从零开始构建地下水数值模型的完整工作流指南。详细解析了从项目规划、数据准备与导入,到构建三维概念模型、生成并运行数值模型,直至结果可视化与校准的核心步骤。帮助水文地质与环工领域初学者快速掌握这一专业软件,高效完成从数据到三维建模的全过程。

a1b2c的博客 800

[C语言][剑指offer篇]--II. 和为s的连续正数序列 (滑动窗口)

1. 题目描述 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 2. 理清思路  根据题意“输出所有和为target的连续正整数序列”,首先“连续正整数序列和”在数学上有求和公式,比方 l 指向连续正整数序列的首元素,r指向连续正整数序列的尾元素,由题意可知初始值 l = 1 , r = 2 ,则 l ~ r 之间的和为: sum=(l+r)∗(r−l+1)2sum=\frac{(l + r)*

静待另一片蓝天 495

GT-suite v2016的下载和安装

1 写在前面 GT-suite 是一款用来做内燃机仿真的软件。在安装过程中遇到很多问题,网上的安装教程也大都抄来抄去,试着安装了几遍都没有成功。最终在贴吧一个老哥的帖子里找到了解决办法,但是老哥的帖子也不是很详细,所以做了这个详细版本的教程。 GT-suite v2016安装包: 链接:https://pan.baidu.com/s/1JZPgJ8_-J-L8rV84-eHedQ 提取码:uj...

kisssshot的博客 3万+

和为s的连续正数序列(剑指offer)---C语言

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 示例 1: 输入:target = 9 输出:[[2,3,4],[4,5]] 示例 2: 输入:target = 15 输出:[[1,2,3,4,5],[4,5,6],[7,8]] 限制: 1 <= target <= 10^5 /** * Return an array of arrays of size *returnSize.

gdarg的博客 408

Vivado项目开发新思路:用VSCode写代码,用Vivado管理IP核与综合(Windows/Mac环境通用指南)

本文介绍了如何结合Vivado和VSCode的优势,打造高效的FPGA设计工作流。通过配置VSCode的Verilog插件和Vivado环境集成,开发者可以在VSCode中编写代码,同时利用Vivado管理IP核与综合,显著提升开发效率和团队协作体验。

weixin_42545503的博客 337

基于CNN对抗嵌入的图像隐写——CNN-Based Adversarial Embedding for Image Steganography

CNN-Based Adversarial Embedding for Image Steganography https://ieeexplore.ieee.org/abstract/document/8603808 这篇论文发表在TIFS( IEEE TRANSACTIONS ON INFORMATION FORENSICS AND SECURITY),TIFS是网络与信息安全领域的国际两大顶级期刊之一,中国计算机学会(CCF)推荐的A类期刊,SCI一区TOP期刊,目前影响因子有7多了。 1 概

weixin_48654804的博客 2279

剑指offer57:和为s的连续正数序列 python

剑指offer57:和为s的连续正数序列 python题目描述解法双指针定义区间法利用等差数列加和的方法思考感想 题目描述 解法 双指针定义区间法 定义两个指针,两个指针窗口内的数字相加。如果加和小于等于target那么右指针向右移一个位置,如果加和大于target,那么左指针向右移一位。 class Solution: def findContinuousSequence(self, target: int) -> List[List[int]]: i = 1

weixin_43494312的博客 400

Python全栈入门到实战【进阶篇 1】类与对象:面向对象编程的基石

Python中定义类使用**class关键字**,创建对象使用**类名()**(类似调用函数),语法简洁,我们从最基础的空类开始,逐步拆解。class# 定义空的学生类,pass表示占位,无实际内容 class Student : pass编码规范:类名遵循大驼峰命名法(每个单词首字母大写,无下划线),如StudentCarPhone,这是Python官方推荐的PEP8规范,便于区分类和其他标识符。实例方法必须定义在类内部;实例方法的第一个参数必须是self(名称可自定义,如this。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 3403

LeetCode & 剑指Offer:和为S的两个数字、和为S的连续正数序列、和为S的子数组

剑指Offer(四十二):和为S的两个数字 题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。 1、思路 对于一个数组,我们可以定义两个指针,一个从左往右遍历(pleft),另一个从右往左遍历(pright)。首先,我们比较第一个数字和最后一个数字的和cu...

Tiger数学之家的博客 404

【XCharts插件】3-1、制作图表及代码生成图表(v1.0)

XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。【Unity3D插件】XCharts插件完全教程《全网最全》-专栏文章目录OK,这是v1.0版本的XCharts插件的创建图表,代码生成图表的教程。可能有人要问了,既然都更新到v3.0了,还写啥v1.0教程呢。因为有些项目就是用v1.0去制作图表了,也没有太多的精力去更新插件,所以就一直用的v1.0,而且v1.0已经能实现大部分的图标样式了,所以,博主还是单独写了一篇文章来介绍v1.0的功能。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1293

【生信分析】clusterProfiler: universal enrichment tool for functional and comparative study(1)

clusterProfiler: universal enrichment tool for functional and comparative studyClusterProfiler: 用于功能和比较研究的通用富集工具总览1. 引言1.1 术语1.1.1 基因集和通路1.1.2 基因同源(GO)1.1.3 京都基因与基因组百科全书(KEGG)1.1.4 其他基因集2. 功能富集分析方法2.1 过度表征分析(Over Representation Analysis)2.2 基因集富集分析(Gene Se

小哲的博客 1365

剑指offer:面试题41——和为s的连续正数序列

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

MereX的博客 411

openclaw update时出现Skipped:this OpenClaw install isn‘t a git checkout,and the package manager解决方案

本文主要介绍了openclaw update时出现openclaw update时出现Skipped:this OpenClaw install isn’t a git checkout,and the package manager解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

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

剑指Offer: 和为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]] 算法 双指针 设置两个指针 i 和 j ,分别指向连续正数序列的起始和终止 用S...

Erice_s的博客 266

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

剑指offer:Python 和为S的连续正数序列 图解 和为s的连续正数序列

图解 和为S的连续正数序列 实现过程

storyfull 317

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

Cannon的博客 187

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

pynash123的博客 145

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

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

zhpf225的博客 121

剑指offer第41题:和为S的连续正数序列

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

可爱的小腊肉 245

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

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

amoscykl的博客 190
上一篇: 剑指offer:和为S的两个数字
下一篇: GRU
暴躁的猴子
博客等级 码龄10年 230粉丝 273原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值