算法的学习笔记—和为 S 的连续正数序列(牛客JZ74)

news2024/11/8 12:58:31

在这里插入图片描述

img

😀前言
在牛客网的《剑指 Offer》系列题中,有一道关于输出和为给定值 S 的连续正数序列的问题。这是一道典型的双指针问题,考察我们对连续数列求和的理解和双指针的应用。本文将详细解析这道题的思路,并展示如何实现代码。

🏠个人主页:尘觉主页

文章目录

  • 🥰和为 S 的连续正数序列
    • 😊题目描述
    • 😄题目描述
    • 💝解题思路
      • 双指针的具体步骤:
      • 示例代码
      • 代码解析
      • 示例运行
      • 时间复杂度分析
    • 😄总结

🥰和为 S 的连续正数序列

😊题目描述

牛客网

😄题目描述

题目要求:给定一个正整数 SSS,找出所有和为 SSS 的连续正数序列。例如,当 S=100S = 100S=100 时,符合条件的序列有:

[9, 10, 11, 12, 13, 14, 15, 16]
[18, 19, 20, 21, 22]。

💝解题思路

我们需要找到和为 SSS 的连续正数序列,这道题可以使用 双指针 的方法来解决。

双指针的具体步骤:

  1. 初始化两个指针:设定起始位置 start 为 1,end 为 2,并且计算它们之间的当前和 curSum = 3
  2. 滑动窗口调整
    • 如果 curSum 大于 SSS,则需要减小序列和,将 start 右移,同时从 curSum 中减去 start 的值。
    • 如果 curSum 小于 SSS,则需要增加序列和,将 end 右移,同时将 end 的值加到 curSum 中。
    • curSum 刚好等于 SSS 时,找到了符合条件的序列 [start, start + 1, ..., end],将该序列存入结果列表中,并继续调整 startend 寻找下一组符合条件的序列。
  3. 循环终止条件:只要 end < sum,就继续调整指针,直到遍历完所有可能的序列。

示例代码

以下是完整的 Java 实现代码:

import java.util.ArrayList;

public class ContinuousSequenceSum {

    public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
        // 用于存储所有符合条件的连续序列集合
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        
        // 初始化滑动窗口的左右边界
        int start = 1; // 窗口左边界
        int end = 2;   // 窗口右边界
        
        // 当前窗口的元素和,初始为 start + end
        int curSum = start + end;
        
        // 当窗口的右边界未达到 sum 时,继续寻找符合条件的序列
        while (end < sum) {
            // 如果当前窗口和大于目标值 sum,则需要缩小窗口
            if (curSum > sum) {
                // 从 curSum 中减去 start,并右移 start 缩小窗口
                curSum -= start;
                start++;
            } 
            // 如果当前窗口和小于目标值 sum,则需要扩大窗口
            else if (curSum < sum) {
                // 右移 end,并将新的 end 值加入 curSum 中
                end++;
                curSum += end;
            } 
            // 当前窗口和正好等于 sum,找到符合条件的序列
            else {
                // 创建当前序列,并将 start 到 end 的所有整数添加到列表中
                ArrayList<Integer> sequence = new ArrayList<>();
                for (int i = start; i <= end; i++) {
                    sequence.add(i);
                }
                
                // 将符合条件的序列加入结果集合
                result.add(sequence);
                
                // 缩小窗口以寻找下一个可能的序列
                curSum -= start;
                start++;
                end++;
                curSum += end;
            }
        }
        
        // 返回所有符合条件的连续序列集合
        return result;
    }

    public static void main(String[] args) {
        ContinuousSequenceSum sequenceFinder = new ContinuousSequenceSum();
        int targetSum = 100;
        
        ArrayList<ArrayList<Integer>> sequences = sequenceFinder.FindContinuousSequence(targetSum);
        
        // 输出所有找到的序列
        for (ArrayList<Integer> seq : sequences) {
            System.out.println(seq);
        }
    }
}

代码解析

  • 变量定义ret 用于存储符合条件的序列集合,startend 是双指针,用来标记当前连续序列的开始和结束。
  • 循环控制:在 while 循环中,startend 不断调整,直到 curSum 等于 SSS 或者 end 达到上限。
  • 更新逻辑:每次找到符合条件的序列后,将 curSum 减去 start,然后右移 start 指针,以便寻找新的可能序列。

示例运行

S = 100 为例,程序将输出:

[9, 10, 11, 12, 13, 14, 15, 16]
[18, 19, 20, 21, 22]

时间复杂度分析

该算法的时间复杂度为 O(n)O(n)O(n),因为 startend 指针在整个过程中最多各自移动 nnn 次。同时,该方法仅使用了常数空间 O(1)O(1)O(1),用于存储结果的空间不计入复杂度。

😄总结

此题使用滑动窗口(双指针)解法,实现简洁高效。掌握这种思路对解决类似连续数列求和问题非常有帮助。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2228371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

D53【python 接口自动化学习】- python基础之模块与标准库

day53 自定义模块 学习日期&#xff1a;20241030 学习目标&#xff1a;模块与标准库 -- 67 自定义模块&#xff1a;如何编写一个完整功能&#xff1f; 学习笔记&#xff1a; 创建自定义模块 自定义模块注意事项 自定义模块 def func1():return this is a functionclass Cl…

上市公司企业数字金融认知数据集(2001-2023年)

一、测算方式&#xff1a;参考C刊《经济学家》王诗卉&#xff08;2021&#xff09;老师的做法&#xff0c;数字金融认知使用每万字年报描述中包含的对数字金融相关关键词的提及次数&#xff0c;关键词为&#xff1a;互联网、数字化、智能、大数据、电子银行、金融科技、科技金融…

4.2-7 运行MR应用:词频统计

文章目录 1. 准备数据文件2. 文件上传到HDFS指定目录2.1 创建HDFS目录2.2 上传文件到HDFS2.3 查看上传的文件 3. 运行词频统计程序的jar包3.1 查看Hadoop自带示例jar包3.2 运行示例jar包里的词频统计 4. 查看词频统计结果5. 在HDFS集群UI界面查看结果文件6. 在YARN集群UI界面查…

How to Train Neural Networks for Flare Removal

Abstract 当相机指向强光源时&#xff0c;生成的照片可能包含镜头眩光伪影。 耀斑以多种形式出现&#xff08;光晕、条纹、渗色、雾霾等&#xff09;&#xff0c;这种外观的多样性使得去除耀斑变得具有挑战性。 现有的分析解决方案对伪影的几何形状或亮度做出了强有力的假设&a…

Kafka如何控制消费的位置?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka如何控制消费的位置?】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka如何控制消费的位置? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#xff0c;控制消费位置主要通过以下几个机制来实…

shell脚本实例(4)while实现1+...+100,linux新增用户

while实现1到100求和 #!/bin/bash/ s0 i1 #-le小于等于 while [ $i -le 100 ] dos$[ $s$i ]i$[ $i1 ] done echo $s echo $i 执行结果如下 修改用户名密码脚本 #!/bin/bash/ #提示用户输入用户名 read -p "请输入用户名&#xff1a;"username useradd $username #提…

Qt 实战(10)模型视图 | 10.5、代理

文章目录 一、代理1、简介2、自定义代理 前言&#xff1a; 在Qt的模型/视图&#xff08;Model/View&#xff09;框架中&#xff0c;代理&#xff08;Delegate&#xff09;是一个非常重要的概念。它充当了模型和视图之间的桥梁&#xff0c;负责数据的显示和编辑。代理可以自定义…

lenovo联想小新 潮7000-14AST(81GE)笔记本原厂Win10系统镜像安装包下载

适用机型&#xff1a;【81GE】 链接&#xff1a;https://pan.baidu.com/s/1ciGya7OjTN73rHFJs52WpQ?pwdkgk4 提取码&#xff1a;kgk4 联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家、联想浏览器…

C语言部分输入输出(printf函数与scanf函数,getchar与putchar详解,使用Linux ubuntu)

1.输入输出 1.1.按格式输入输出 printf 可以在man手册中查看 int printf(const char *format, ...); printf:函数名(参数)int:函数的返回值 功能&#xff1a;按格式在终端输出 参数&#xff1a;多参 返回值&#xff1a;输出字符个数 格式&#xff1a; %d int %c char…

Jmeter自动化实战

一、前言 由于系统业务流程很复杂,在不同的阶段需要不同的数据,且数据无法重复使用,每次造新的数据特别繁琐,故想着能不能使用jmeter一键造数据 二、创建录制模板 可参考:jmeter录制接口 首先创建一个录制模板 因为会有各种请求头,cookies,签名,认证信息等原因,导致手动复制…

【mysql】4-2. MySQL存储结构

MySQL存储结构 1 什么是表空间⽂件&#xff1f; 解答问题 表空间⽂件是⽤来存储表中数据的⽂件&#xff0c;表空间⽂件的⼤⼩由存储的数据多少决定&#xff0c;不同的表空间⽂件存储数据的种类也有所不同&#xff0c;在MySQL中表空间分为五类&#xff0c;包括&#xff1a;系统…

Ansible基本使用

目录 介绍 安装 inventory-主机清单 分组 子组 modules-模块 command shell script file copy systemd yum get_url yum_repository user mount cron 介绍 ansible是基于python开发的自动化运维工具。架构相对比较简单&#xff0c;仅需通过ssh连接客户机执行…

HivisionIDPhoto Docker部署以及Springboot接口对接(AI证件照制作)

项目简介 项目以及官方文档地址 HivisionIDPhoto 旨在开发一种实用、系统性的证件照智能制作算法。 它利用一套完善的AI模型工作流程&#xff0c;实现对多种用户拍照场景的识别、抠图与证件照生成。 HivisionIDPhoto 可以做到&#xff1a; 轻量级抠图&#xff08;纯离线&a…

DB-GPT系列(一):DB-GPT能帮你做什么?

DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL and Agents)&#xff0c;围绕大模型提供灵活、可拓展的AI原生数据应用管理与开发能力&#xff0c;可以帮助企业快速构建、部署智能AI数据应用&#xff0c;通过智能数据分析、洞察…

整理了一些大模型的课程,非常详细,大模型零基础入门到精通,收藏我这一篇就够了

目前有多个科普类的大模型课程&#xff0c;这些课程涵盖了从基础理论到实际应用的各个方面。以下是一些主要的科普类大模型课程&#xff1a;复旦大学“大模型开发与赋能”专题讲习班&#xff1a;由复旦大学计算机学院邱锡鹏教授带来的《大模型科普讲解》课程&#xff0c;通过深…

Chromium 中profile browser 和WebContents三者之间的关系c++

一、prfile介绍&#xff1a; 1、浏览器默认启动会创建一个默认的profile在Default目录下。 C:\Users\Administrator\AppData\Local\Chromium\User Data\Default目录下 【与窗口绑定】 proflie与N个browser对象绑定。 2、用户新建一个账户会在User Data目录下新建一个prfol…

el-datepicker此刻按钮点击失效

文章目录 此刻按钮失效原因&#xff1a;使用了禁用未来日期解决办法&#xff1a;重写此刻按钮点击事件代码&#xff08;包含禁用未来日期和时分秒的处理&#xff09;框出主要代码&#xff08;因为包含禁用日期功能&#xff09;&#xff08;取你所需&#xff09; 此刻按钮失效原…

shodan3,vnc空密码批量连接,ip历史记录查找

shodan语法&#xff0c;count&#xff0c;honeyscore count 今天带大家继续学习shodan&#xff0c;今天会带大家学一学这个count命令&#xff0c;再学学其他小命令好其实关键命令也没那么多&#xff0c;就是很方便记忆一下就学会了这样子。 shodan count "/x03/x00/x00…

node和npm

背景&#xff08;js&#xff09; 1、为什么js能操作DOM和BOM? 原因&#xff1a;每个浏览器都内置了DOM、BOM这样的API函数 2、浏览器中的js运行环境&#xff1f; v8引擎&#xff1a;负责解析和执行js代码 内置API&#xff1a;由运行环境提供的特殊接口&#xff0c;只能在所…

【Eclipse系列】eclipse快捷键和设置

本文以4.24版本为例&#xff0c;详细介绍一下常用快捷键&#xff0c;以及如何设置 一、常用快捷键 1.1、代码注释 Ctrl / &#xff1a;注释或取消当前行。Ctrl Shift C&#xff1a;注释或取消当前行。Ctrl Shift / &#xff1a;注释多行。Ctrl Shift \ &#xff1a;取…