【动态规划-简单】53. 最大子数组和(线段树)

数据结构实验1 集合的交、并、差 姓名:Far_Rainbow 学号: 202505000X 专业: 软件工程 年级:2020级 实验名称:实验1 集合的交、并、差 实验内容: (1)实验目的 通过该实验,让学生复习巩固C语言中的循环结构、循环控制条件、分支结构和数组/链表、函数的调用等有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。 (2)实验内容 通过键盘,分别输入两个数据元素类型为正整数的集合A和B,以负数输入为结束条件,输出两个集合的交、并、差。 (3)实验要求 从程序完善性上考虑,集合元 阅读详情

【题目】
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。
示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

1 <= nums.length <= 105
-104 <= nums[i] <= 104

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

【代码】
在这里插入图片描述

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        pre=0
        for index,item in enumerate(nums):
            item=max(item,pre+item)
            nums[index]=item
            pre=item
        return max(nums)

【方法2:分治法】
在这里插入图片描述

class Solution:
    # 分治法: 线段树
    def maxSubArray(self, nums: List[int]) -> int:
        class wtevTree : # 线段树
            lSum = 0 # 以左区间为端点的最大子段和
            rSum = 0 # 以右区间为端点的最大子段和
            iSum = 0 # 区间所有数的和
            mSum = 0 # 该区间的最大子段和
            def __init__(self,l, r, i, m) : # 构造函数
                self.lSum = l
                self.rSum = r
                self.iSum = i
                self.mSum = m        


        # 通过既有的属性,计算上一层的属性,一步步往上返回,获得线段树
        def pushUp(self, leftT: wtevTree, rightT: wtevTree) -> wtevTree:
            # 新子段的lSum等于左区间的lSum或者左区间的 区间和 加上右区间的lSum
            l = max(leftT.lSum, leftT.iSum + rightT.lSum)
            # 新子段的rSum等于右区间的rSum或者右区间的 区间和 加上左区间的rSum
            r = max(leftT.rSum + rightT.iSum, rightT.rSum)
            # 新子段的区间和等于左右区间的区间和之和
            i = leftT.iSum + rightT.iSum
            # 新子段的最大子段和,其子段有可能穿过左右区间,或左区间,或右区间
            m = max(leftT.rSum + rightT.lSum, max(leftT.mSum, rightT.mSum))
            return wtevTree(l, r, i, m)
        
        # 递归建立和获得输入区间所有子段的结构
        def getInfo(self, nums: List[int], left: int, right: int) -> wtevTree:
            if (left == right): # 若区间长度为1,其四个子段均为其值
                return wtevTree(nums[left], nums[left], nums[left], nums[left])
            mid = (left + right) >> 1 # 获得中间点mid,右移一位相当于除以2,运算更快
            leftT = getInfo(self, nums, left, mid)
            rightT = getInfo(self, nums, mid + 1, right) # mid+1,左右区间没有交集。
            return pushUp(self, leftT, rightT) # 递归结束后,做最后一次合并
    
        if ( not nums or len(nums) <= 0): # 输入校验
            return 0
        lens = len(nums) # 获取输入长度
        return getInfo(self, nums, 0, lens - 1).mSum
2xmax96717+max96724+agx orin驱动代码 说明:这里主要解决max96717的设备地址和sensor地址映射,vc0->vc1多颗max96717+max96724使用配置思路如下: 1、改变max96717的pipez stream id,然后max96724的pipe绑定使用相应的stream id 2、max96717默认是vc0,把vc0改写成vc1\vc2\vc3,然后max96724再重新映射vc输出 阅读详情

相关推荐

嵌入式开发必备:UART、RS232、RS485通信协议实战对比(附代码示例)

本文从嵌入式开发实战角度,深度对比了UART、RS232和RS485三种核心串行通信协议。详细解析了它们的工作原理、硬件连接、代码配置及典型应用场景,并提供了基于通信距离、节点数量和电磁环境的三维度选型指南,帮助开发者根据项目需求做出最优技术决策。

i0j1k2l3m的博客 475

线段树与区间最大子段和问题,这一篇就够了

1、经典的区间最大子段和问题 问题描述:给定一个序列a1,a2,a3,..ana_1,a_2, a_3,..a_na1​,a2​,a3​,..an​,如何求出该序列的最大子段和?(询问的区间个数为mmm) 解决方案: - 暴力统计:对于每一个区间[l,r][l,r][l,r],每一次选定一个子段的起点,然后枚举子段的长度,算法复杂度为O(mn2)O(mn^2)O(mn2)。 - 动态规划:我们一次性算出所有的区间的最大子段和,然后使用直接询问答案。我们规定: - ls\color{Green}lsls

m0_51156601的博客 6974

数学建模——相关系数(4)——斯皮尔曼相关系数(spearman)

文章目录引述斯皮尔曼相关系数(spearman)定义 引述 经过之前几节的学习,我们了解并掌握了皮尔逊相关系数。在学习中我们发现,皮尔逊相关系数的使用条件相当苛刻:两组变量必须是连续数据、呈现正态分布,且两者间必须成线性关系。如果我们在数学建模中拿到一组数据无法满足以上条件,那么有没有其他的方法去判断两组变量之间的相关性呢?答案是肯定的,它就是斯皮尔曼相关系数(spearman). 斯皮尔曼相关系...

东 6万+

最大子序和(线段树)

题目描述:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入:[-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。 本题常规的暴力枚举(或称动态规划dp)不再细说,给出使用线段树的解题思路。 优势:使用线段树对于本题并不能改进其时间复杂度,但它能够灵活应用于不同的场景。它不仅可以解决区间 [0, n

growthmindset的博客 468

AI中台系统设计方案探讨

集成JupyterLab、低代码建模工具(如H2O.ai)、预训练模型库(Hugging Face、PaddleHub)。:通过REST/gRPC接口封装AI能力(如OCR、语音识别),支持流量控制与鉴权(如Kong、Apigee)。:服务注册发现(Consul)、熔断降级(Hystrix)、监控告警(Prometheus+Grafana)。:分布式存储(如HDFS、Ceph)与对象存储(如S3、OSS),支持海量数据高速读写。加密传输(TLS)、动态脱敏(如数据掩码)、访问控制(RBAC)。

reset2021的博客 1036

告别手动刷金币:零代码配置实现番茄小说自动化任务

本文详细介绍如何利用零代码配置工具实现番茄小说自动化任务,告别手动刷金币的烦恼。通过冰狐智能辅助工具的可视化配置和元数据复用功能,用户无需编程基础即可快速设置自动签到、观看广告等任务流程,大幅提升效率并避免断签风险。

weixin_42522953的博客 297

利用线段树求最大连续子序列和

#include &amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;gt; using namespace std; struct Node { int Pre, Max, Suf,Sum; int Left, Right; }; struct Node SegTree[100]; int c[100] = {0,45,-88,5,2,-8,-7,88,-9}; void Built...

Lotuscc的博客 631

基于 MATLAB 的精馏塔模拟仿真

基于 MATLAB 的精馏塔模拟仿真精馏塔是一种重要的化工设备,其中乙烯精馏塔和醋酸乙烯精馏塔是常见的两种精馏塔。本文基于 MATLAB 软件,给出了针对这两种精馏塔的模拟仿真代码。

与其临渊羡鱼,不如退而结网 904

最大子段和(线段树)

1. 问题描述: input:第一行输入的n和数字表示区间1-n区间上的数字,第二行输入给定区间的起始位置和结束位置,第三行到n + 2行输入区间1-n的数字 output:输入给定区间的最大子段和(该区间内的代数和是最大的) 2. 思路分析: ① 对于最大子段和的问题,我们常规的解法是使用线段树来做,通过二分法递归求解,每一次都是分为两个区间,所以需要先取一个中点center,...

二哈 884

PCL 点云八叉树射线相交

PCL 点云八叉树射线相交

dayuhaitang1的博客 851

CANFD加速是什么?和CANFD有什么区别?

在使用CAN设备上位机的时候,已经选择了CANFD,但还有一个选项是“CANFD加速”,那CANFD加速和不加速有什么区别呢?刚接触CANFD小伙伴肯定一脸懵,本篇主要是给大家分享一下他们的区别,如果对你有帮助,请转发,收藏,点赞💐🎉👍😊

汽车电子软件领域知识分享 1040

1264 动态求连续区间和(线段树模板-无懒标记)

1. 问题描述: 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和。 输入格式 第一行包含两个整数 n 和 m,分别表示数的个数和操作次数。 第二行包含 n 个整数,表示完整数列。 接下来 m 行,每行包含三个整数 k,a,b (k=0,表示求子数列[a,b]的和;k=1,表示第 a 个数加 b)。数列从 1 开始计数。 输出格式 输出若干行数字,表示 k=0 时,对应的子数列 [a,b] 的连续和。 数据范围 1 ≤ n ≤ 100000, 1

二哈 437

使用pyqt5实现可勾选的测试用例界面

使用pyqt5实现可勾选的测试用例界面

天赐好车的博客 629

leetcode_53 最大子数组和

本文探讨了求解最大子数组和的四种方法:暴力枚举(O(n²))、动态规划(O(n))、贪心算法和分治策略。动态规划通过状态转移方程优化空间至O(1);贪心算法采用"抛弃负收益"策略;分治法则将问题分解为左右子区间处理,需维护区间和、左右端点极值等参数,时间复杂度为O(nlogn)。其中动态规划和贪心解法最为高效,空间复杂度均为O(1),体现了不同算法思想在解决同一问题时的多样性与优化思路。

bdn_nbd的博客 1109

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【动态规划-Kadane】【贪心】【线段树数据结构&&分治】力扣53.最大子数组和

mSum表示 [l,r] 内的最大子段和,这时候有三种情况,一种是他的左子节点的mSum等于他的mSum,第二种是他的右子节点的mSum等于他的mSum,第三种是从m的两边都取元素作为子段元素,这时他的mSum = 左子节点的rSum + 右子节点的lSum,将三者进行比较,取最大值返回就是题目的解。lSum:线段树节点以l为左端点的最大子段和,这时候有两种情况,一种是左子节点的lSum,也就是右子节点的lSum为负数成分较大的时候,左子节点的lSum一般就是该节点的lSum。是数组中的一个连续部分。

sjsjs11的博客 1878

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

算法leetcode|53. 最大子数组和(rust重拳出击)

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。

二当家的白帽子 1921

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

(13)LeetCode 53. 最大子数组和

Kadane代码简短、效率极高。分治思想经典,体现了“分而治之”及区间合并的通用技巧。注意处理全负数边界情况,确保子数组非空。

qq_46121420的博客 191

leetcode:53. 子数组最大累加和

题目来源 leetcode 题目描述 题目解析 暴力法 int maxSubArray(vector<int> & nums){ int max = INT_MIN; for (int i = 0; i < nums.size(); ++i) { int sum = 0; for (int j = i; j < nums.size(); ++j) { sum += nums[j];

OceanStar的博客 710

LeetCode 53. 最大子序和(Python、动态规划、分治(线段树))

学习分治(线段树) 的应用,同时记住递归的空间复杂度(栈的深度) 题目描述 文章目录方法一:动态规划方法二:分治 方法一:动态规划 思路和算法 假设 nums 数组的长度是 nnn,下标从 000 到 n−1n - 1n−1。 我们用 aia_iai​ 代表 nums[i]nums[i]nums[i],用 dp(i)dp(i)dp(i) 代表以第 iii 个数结尾的「连续子数组的最大和」,那么很显然我们要求的答案就是: max⁡0≤i≤n−1f(i) \max_{0 \leq i \leq n - 1.

稚嫩的劢劢的博客 629

❤️思维导图整理大厂面试高频数组13: 3种方法彻底解决最大子序和问题, 了解线段树的思想, 力扣53❤️

此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), 毕竟算法不是做了一遍就能完全记住的. 所以本文适合已经知道解题思路和方法, 想进一步加强理解和记忆的朋友, 并不适合第一次接触此题的朋友(可以根据题号先去力扣看看官方题解, 然后再看本文内容). 关于本专栏所有题目的目录链接, 刷算法题目的顺序/注意点/技巧, 以及思维导图源文件问题请点击此链接. 想进大厂.

孤柒的博客 1万+

53. 最大子数组和

动态规划

hpu风之旅 191

【Leecode】Leecode刷题之路第53天之最大子数组和

是数组中连续的 非空 元素序列。代码示例:(Java)代码示例:(Java)代码示例:(Java)

工一木子 375

【LeetCode - Java】53. 最大子数组和 (简单 | 并不简单)

目录1. 题目描述2. 解题思路3. 代码实现3.1 O(n³)解法(卒 | 时间超限)3.2 O(n²)解法(卒 | 时间超限)3.3 动态规划3.4 分治法3.5 对比 1. 题目描述 2. 解题思路 这道题目看到的第一个瞬间就是想着用循环!暴力!整它!最外层循环是决定子数组的起始位置;中层循环是决定子数组的长度;最内层循环是用于把该子数组的数全部加起来;最后把这个累加值与历史最大值比较,完成全部循环则得到子数组累加的最大值了。这种解法很好理解,可是,时间超限。我也理解,毕竟这是立方级的时间复杂度了。

Beemo的博客 753

leetcode刷题 53. 最大子数组和,Easy (Java)动规+贪心+分治(动态规划超详解,包括优化)

leetcode刷题 53. 最大子数组和,Easy (Java)动规+贪心+分治(动态规划超详解,包括优化)

Sueko的博客 439

24暑假算法刷题 | Day44 | 动态规划 XI | 子序列问题 II | LeetCode 1143. 最长公共子序列,53. 最大子数组和,392. 判断子序列

day44:动态规划XI,子序列问题II

weixin_54468359的博客 1353

53. 最大子数组和 【@我的刷题日记】

难度:中等 日期:2023年5月25日给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [5,4,-1,7,8]输出:23。

qq_62005445的博客 112
上一篇: 【动态规划-困难】354. 俄罗斯套娃信封问题
下一篇: 【动态规划-简单】剑指 Offer 42. 连续子数组的最大和
菜菜2022
博客等级 码龄9年 67粉丝 1033原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值