当前位置: 首页 > article >正文

算法与数据结构精讲:最大子段和(暴力 / 优化 / 分治)+ 线段树从入门到实战

前言最大子段和是最经典的入门题之一而线段树则是处理区间查询、区间更新的高级数据结构是进阶必备。本文将基于我提供的完整代码分两大部分精讲最大子段和问题暴力 O (n³) → 优化 O (n²) → 分治 O (nlogn)线段树Segment Tree原理 构建 区间和查询 完整代码实现所有代码均可直接复制运行复杂度分析、边界处理、核心思路全部讲透。第一部分最大子段和问题一、问题描述给定一个整数数组可包含负数找到连续子数组使其和最大返回这个最大和。数组{-2, 11, -4, 13, -5, -2} 最大子段11 (-4) 13 20 输出20二、解法 1暴力枚举O (n³)思路枚举所有起点 i、终点 j再循环累加 i~j 的和记录最大值。// 暴力破解 O(n³) int MaxSum1(const int* ar, int n) { assert(ar ! nullptr); if (n 1) return 0; int sum 0; int start -1; int end -1; // 枚举起点 i for (int i 0; i n; i) { // 枚举终点 j for (int j i; j n; j) { int thissum 0; // 累加 i~j for (int k i; k j; k) { thissum ar[k]; } // 更新最大值 if (thissum sum) { sum thissum; start i; end j; } } } return sum; }复杂度三层循环O(n³)缺点效率极低数据稍大就会超时。三、解法 2优化暴力O (n²)思路去掉最内层循环在 j 向后移动时直接累加避免重复计算。//优化 MaxSum1O(n²) int MaxSum2(const int* ar, int n) { assert(ar ! nullptr); if (n 1) return 0; int sum 0; int start -1; int end -1; for (int i 0; i n; i) { int thissum 0; // j 向后移动时直接累加 for (int j i; j n; j) { thissum ar[j]; if (thissum sum) { sum thissum; start i; end j; } } } return sum; }复杂度两层循环O(n²)优点比暴力法快很多实现简单。四、解法 3分治法O (nlogn)—— 重点推荐思路经典分治思想把数组从中间分成左右两部分递归求左半边最大子段和递归求右半边最大子段和计算跨中点的最大子段和最关键取三者最大值即为答案// 分治递归函数 int MaxSubSum(const int* ar, int left, int right) { int sum 0; // 递归出口只有一个数 if (left right) { sum ar[left] 0 ? ar[left] : 0; } else { // 1. 找中点 int mid (right - left) / 2 left; // 2. 递归左右 int leftsum MaxSubSum(ar, left, mid); int rightsum MaxSubSum(ar, mid 1, right); // 3. 求跨中点最大和左半部分从mid向左 int s1 0, lefts 0; for (int i mid; i left; --i) { lefts ar[i]; if (lefts s1) s1 lefts; } // 右半部分从mid1向右 int s2 0, rights 0; for (int i mid 1; i right; i) { rights ar[i]; if (rights s2) s2 rights; } // 4. 三者取最大 sum s1 s2; if (sum leftsum) sum leftsum; if (sum rightsum) sum rightsum; } return sum; } // 分治法入口 int MaxSum3(const int* ar, int n) { assert(ar ! nullptr); if (n 1) return 0; return MaxSubSum(ar, 0, n - 1); }复杂度每次二分 线性遍历O(nlogn)优点效率高体现高级算法思想。五、测试运行#define ArSize(ar) (sizeof(ar)/sizeof(ar[0])) int main() { int ar[] { -2,11,-4,13,-5,-2 }; int n ArSize(ar); int maxval MaxSum3(ar, n); cout maxval endl; // 输出 20 return 0; }第二部分线段树Segment Tree原理与实现一、什么是线段树线段树是一种二叉树结构每个节点代表一个区间。核心用途快速查询区间和 / 区间最值 / 区间 gcd快速进行区间更新时间复杂度构建 O (n)查询 O (logn)二、线段树核心结构用数组模拟二叉树左孩子2*node1右孩子2*node2空间大小4*n足够安全三、完整代码实现区间和查询1. 构建线段树build递归将区间拆分到叶子节点自底向上求和。2. 区间查询query判断当前区间是否在查询范围内递归合并结果。#includevector #includeiostream using namespace std; class SegmentTree { private: std::vectorint tree; // 线段树数组 int n; // 原始数据长度 // 递归构建 void build(const vectorint ar, int node, int start, int end) { if (start end) { tree[node] ar[start]; return; } int mid (end - start) / 2 start; int leftChild node * 2 1; int rightChild node * 2 2; build(ar, leftChild, start, mid); build(ar, rightChild, mid 1, end); // 父节点 左孩子 右孩子 tree[node] tree[leftChild] tree[rightChild]; } // 区间查询 [left, right] int query(int node, int start, int end, int left, int right) { // 无交集返回0 if (right start || left end) { return 0; } // 完全包含直接返回节点值 if (left start end right) { return tree[node]; } // 部分交集递归查询左右 int mid start (end - start) / 2; int leftChild 2 * node 1; int rightChild 2 * node 2; int leftsum query(leftChild, start, mid, left, right); int rightsum query(rightChild, mid 1, end, left, right); return leftsum rightsum; } public: // 构造函数创建线段树 SegmentTree(const std::vectorint ar) { n ar.size(); if (n 1) return; tree.resize(4 * n, 0); // 开4倍空间 build(ar, 0, 0, n - 1); } // 对外接口区间和查询 int rangeQuery(int left, int right) { if (left 0 || right n || left right) { return -1; } return query(0, 0, n - 1, left, right); } };四、测试运行int main() { std::vectorint ar { 1,3,5,7,9,11 }; SegmentTree segtree(ar); cout segtree.rangeQuery(0, 5) endl; // 1357911 36 cout segtree.rangeQuery(0, 2) endl; // 135 9 cout segtree.rangeQuery(1, 4) endl; // 3579 24 return 0; }输出结果高频考点总结最大子段和暴力法O (n³)简单但低效优化暴力O (n²)去掉重复累加分治法O (nlogn)面试标准解法最优解法动态规划Kadane 算法O (n)线段树用于区间查询、区间更新空间开4*n构建递归自底向上求和查询判断区间交集递归合并复杂度查询 O (logn)

相关文章:

算法与数据结构精讲:最大子段和(暴力 / 优化 / 分治)+ 线段树从入门到实战

前言最大子段和是最经典的入门题之一;而线段树则是处理区间查询、区间更新的高级数据结构,是进阶必备。本文将基于我提供的完整代码,分两大部分精讲:最大子段和问题:暴力 O (n) → 优化 O (n) → 分治 O (nlogn)线段树…...

专业级批量二维码扫描工具V2.0|高精度图片二维码批量识别软件

温馨提示:文末有联系方式软件概述 一款专为高效处理多图场景设计的二维码批量识别解决方案——扩展批量二维码识别工具 V2.0 专业版。 无需逐张打开图片,即可全自动解析各类常见格式图像(JPG/PNG/BMP等)中嵌入的二维码信息&#x…...

2025届最火的六大AI辅助写作工具推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要降低AIGC(人工智能生成内容)的检测率,得从语言风格、逻…...

亚马逊德国站VAT发票自动筛选:手把手教你用浏览器控制台JS代码搞定(附Edge/Chrome/Firefox全版本)

亚马逊德国站VAT发票智能筛选:浏览器控制台JS代码实战指南 每次月底处理税务发票时,跨境电商卖家们是否总被海量的PDF文件淹没?特别是亚马逊德国站的卖家,面对后台密密麻麻的发票列表,手动筛选符合特定税号条件的文件不…...

盘式电机Maxwell电磁仿真模型(双定单转24槽20极)代码功能说明

盘式电机 maxwell 电磁仿真模型 双转单定结构,halbach 结构,双定单转 24 槽 20 极,18槽 1 2 极,18s16p(可做其他槽极配合) 参数化模型,内外径,叠厚等所有参数均可调整 默认模型仅作学…...

《为什么90%的数字孪生都是假的?》——没有空间数据的“孪生”,只是一个会动的PPT

《为什么90%的数字孪生都是假的?》——没有空间数据的“孪生”,只是一个会动的PPT你看到的绝大多数“数字孪生系统”,其实只有三样东西:一个3D模型一堆跳动的数据一个看起来很炫的界面但它们有一个共同点:&#x1f449…...

《公安实战:如何实现“目标持续掌控”?》——从“看见目标”到“永不丢失”,空间智能的真实落地

《公安实战:如何实现“目标持续掌控”?》——从“看见目标”到“永不丢失”,空间智能的真实落地在绝大多数公安视频系统里,有一个无法回避的问题:👉 人,一定会丢。可能是:转角遮挡换…...

C语言的初步认识

大家好!我是河南计算机专业的一名大一学生,很高兴今天加入博客大团体并写下我人生中的第一篇博客,在此我将会记录我大学中的编程生活。1.函数函数是C语言的基本组成单位,初识C语言,我们遇见的第一个函数是main函数&…...

打卡信奥刷题(3071)用C++实现信奥题 P6951 [ICPC 2018 WF] Wireless is the New Fiber

P6951 [ICPC 2018 WF] Wireless is the New Fiber 题目描述 一种新型的无限带宽无线通信刚刚通过测试,并被证明可以替代现有的基于光纤的通信网络,后者正努力跟上流量增长的步伐。你被委托决定新通信网络的布局。当前的通信网络由一组节点(…...

IP-vlan实验报告

一、 实验拓扑二、 实验思路完成二层 vlan 的划分,实现二层隔离三层 IP 配置DHCP 配置三、 测试划分接口情况(display port vlan active)SW1:(截图)SW2:(截图)SW3:(截图)…...

Anaconda3新建环境也卡solving?可能是你的Conda版本和镜像源该更新了

Anaconda3环境依赖解析卡顿的深度优化指南 当你在全新创建的虚拟环境中依然遭遇"solving environment"卡顿问题时,那种等待的煎熬感每个Python开发者都深有体会。这背后往往隐藏着Conda版本与镜像源配置的双重隐患,本文将带你从底层机制到实操…...

豆包写小说软件2025推荐,专业写作助力灵感迸发

豆包写小说软件2025推荐,专业写作助力灵感迸发在当今数字化时代,写小说成为了许多人表达自我、实现创作梦想的途径。然而,对于众多写作者来说,寻找一款专业且实用的写小说软件并非易事。据《2025中国写作软件行业白皮书》显示&…...

虚拟线程/MVCC/Redis数据类型/AQS/CAS/ReentrantLock/Spring三级缓存--学习笔记

java虚拟线程:Java 线程 操作系统线程的 1:1 包装。 java线程缺点: 内存开销大(CPU上下文频繁切换):每个线程默认栈 512KB~1MB,1万并发 10GB阻塞时浪费(阻塞性):线程阻…...

一文搞懂计算机网络基础!

对于想入门网络安全、IT 运维、云计算的同学来说,计算机网络是绕不开的核心基础。但一堆晦涩的概念、复杂的分类,常常让新手望而却步。今天我们就用一张思维导图,把计算机网络基础的核心知识点全部拆解,从定义、作用、类型、核心设…...

如何快速将网页转换为Figma设计稿:5分钟完成HTML到Figma的无缝转换

如何快速将网页转换为Figma设计稿:5分钟完成HTML到Figma的无缝转换 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html HTML到Figma转换工具是一款能够将任何网站转换为可…...

用STC89C52RC单片机DIY一个八路抢答器(附完整源码+PCB文件)

从零打造高性价比八路抢答器:STC89C52RC实战全解析 在电子设计竞赛、课堂互动或是企业培训中,抢答器都是提升参与感的经典设备。市面上的成品动辄数百元,而今天我要分享的,是用不到30元成本自制的智能八路抢答器方案。这个项目特别…...

【linux基础】小白超详细 Ubuntu 安装教程(AI提供)

全程零命令、零复杂设置,只教最稳妥、最安全的单系统全新安装(清空硬盘装Ubuntu),从下载→做U盘→装系统→首次使用一步到位。一、安装前准备(必看!)1. 硬件要求(台式机轻松满足&…...

拓朋N86车载台:畜牧运输的隐形守护者

在广袤无垠的畜牧运输途中,牲畜的安全监控与车队间的协同调度是每位运输人员最为关心的两大要素。在这片充满不确定性的长途路线上,拓朋N86公网集群车载台以其出色的性能,悄然成为了畜牧运输的隐形守护者。 全国覆盖,沟通无阻 畜牧…...

2026届学术党必备的六大降AI率网站推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 使原本旨在降低文本被人工智能检测系统识别概率的降AI工具,借助调整词汇、句式以…...

综合强度信息的激光雷达去拖尾算法解析和源码实现

1. 内容本文主要介绍基于几何特征与信号强度的去拖尾算法,和程序实现。2. 激光雷达的常见误差类型2.1 拖尾(Trailing)拖尾是指当激光束照射到高反射率物体(如反光条、玻璃、镜子、路面标志等)时,在真实目标…...

2025最权威的五大降重复率方案推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下,各种各样的AI生成内容检测系统变得越发精密,这给那些依赖AI进行…...

哈希表入门教程:从零搭建完整结构

一、什么是哈希表?1.核心定义哈希表 数组 哈希函数 冲突解决哈希表是一种通过哈希函数将「键(Key)」映射到「索引(Index)」,从而实现O (1) 平均时间复杂度查找、插入、删除的数据结构。2.核心三要素&…...

2025届毕业生推荐的降重复率神器解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 如果要降低AIGC检测率,那就得着重从文本特征方面着手。首先,词汇多样…...

crypto-js —— 前端数据安全的 JavaScript 加密利器

1. 为什么前端开发需要数据加密? 想象一下这样的场景:你在网上填写了一份包含个人信息的表单,点击提交后,这些数据会以明文形式在网络中传输。如果有人在传输过程中截获了这些数据,你的隐私就会完全暴露。这就是为什么…...

9. C++14新特性-std::tuple 的按类型寻址 (Type-based Tuple Addressing)

一、引言在现代 C 中,当我们想要在一个函数中返回多个不同类型的值,或者临时打包几个数据时,std::tuple(元组)是最标准的容器。然而,C11 提供的基于索引的元组访问方式,在工程实践中暴露出严重的…...

金融级权限设计实战:用RBAC3模型搞定互斥角色、基数限制与操作审计

金融级权限架构设计:基于RBAC3模型的合规实战指南 在金融行业数字化转型浪潮中,权限管理系统不仅是技术组件,更是合规生命线。某跨国银行曾因角色权限漏洞导致数千万美元误操作,最终面临监管重罚——这个真实案例揭示了权限设计在…...

Win10/Win11远程桌面报错‘函数不受支持’?5分钟搞定CredSSP加密Oracle修正

Win10/Win11远程桌面报错‘函数不受支持’?5分钟急救指南 刚准备远程处理工作文件,突然跳出"发生身份验证错误,要求的函数不受支持"的红色警告框——这个场景对需要频繁使用远程桌面的职场人来说简直噩梦。上周我就遇到了同样问题&…...

OZON平台选品指南:揭秘俄罗斯市场的潜力品牌与爆款趋势

对于跨境电商卖家而言,俄罗斯市场正成为一片充满机遇的蓝海。作为俄罗斯本土最大的综合电商平台,OZON的用户规模和消费潜力持续增长。然而,机遇往往伴随着挑战,如何在庞大的商品海洋中精准捕捉爆款,规避风险&#xff0…...

FreeRADIUS配置踩坑记:当LDAP用户遇上Google Authenticator,如何解决PAM模块的那些‘坑’?

FreeRADIUS与LDAP集成Google Authenticator的实战避坑指南 当企业安全团队决定为远程访问系统部署双因素认证时,FreeRADIUS与LDAP集成Google Authenticator的方案常被列为优选。但真正实施时,技术细节中的"魔鬼"往往让工程师们夜不能寐。本文将…...

Yii2的$app->handleRequest($request)的本质的庖丁解牛

$app->handleRequest($request) 是 Yii2 框架运行时心脏的每一次搏动。 如果说 new Application() 是**“创世”(构建世界),那么 $app->handleRequest($request) 就是“演化”(处理事件)。 它是整个 MVC 流程的总…...