动态规划:最大子数组和

连续子数组的最大和(剑指offer)---C语言 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 int maxSubArray(int* nums, int numsSize) { int max = nums[0]; int sum = nums[0]; for(int i = 1; i < numsSize; + 阅读详情

最大子数组和

题干:

给定一个数组nums[],求下标连续的子数组的和的最大值,nums[i]表示第i个元素的数值,可以为负数,i从0开始递增。

nums = [-2,1,-3,4,-1,2,1,-5,4]

解题思路:

化大问题为小问题,通过局部最优解来推出全局最优解。

定义最佳状态数组: dp = [],dp[i]表示到第个元素为止,下标连续的子数组的和的最大值。

定义下标连续的子数组的和的最大值: maxVal,即存放最终答案。因为最大值不一定是dp最后一项。

请添加图片描述

题目分析:

如果数组长度为1

那么子元素长度也只能为1,最大子数组和为 第一个元素的值,此时dp[0]=nums[1];maxVal=nums[1],

最终为:dp[0]=-2; maxVal=-2

如果数组长度为2

前面已经算出了长度为1的数组的最大子数组和为dp[0],那么子数组和有两种情况,要么加上前面最大和dp[0],要么不加。最终加与不加取决于那种方式获得的值是最大的。

情况:

  1. 加。那么长度为2时子数组和最大值为:dp[0]+nums[1]=-2+1=-1
  2. 不加。那么长度为2时子数组和最大值为:nums[1]=1=1

取两者最大,得到至第2个元素为止,最大和为:dp[1] = max(-1,1) =1

算出最终的最大值,maxVal=max(dp[1],maxVal)= 1

如果数组长度为3

前面已经算出了长度为2的数组的最大子数组和为dp[1],那么最大子数组和有两种情况,要么加上前面最大和dp[0],要么不加。最终加与不加取决于那种方式获得的值是最大的。

情况:

  1. 加。那么长度为3是时,子数组和最大值为:dp[1]+nums[2]= 1 + -3 = -2
  2. 不加。那么长度为3时,子数组和最大值为:nums[2]=-3

取两者最大,得到至第3个元素为止,最大和为:dp[2] = max(-2,-3) = -2

算出最终的最大值,maxVal=max(dp[2],maxVal) = max(-2,1)= 1

如果数组长度为n

前面已经算出了长度为n的数组的最大子数组和为dp[n-1],那么最大子数组和有两种情况,要么加上前面最大和dp[n-1],要么不加。最终加与不加取决于那种方式获得的值是最大的。

情况:

  1. 加。那么长度为n是时,子数组和最大值为:dp[n-1]+nums[n]
  2. 不加。那么长度为n时,子数组和最大值为:nums[n]

取两者最大,得到至第n个元素为止,最大和为:dp[n] = max(dp[n-1]+nums[n],nums[n])

算出最终的最大值,maxVal=max(dp[n-1],maxVal)

代码编写

function maxSubArray(){
    /* 给定一个数组nums,求连续的最大的子数组的和为多少*/ 
    let nums = [-2,1,-3,4,-1,2,1,-5,4]
    // 定义初始状态 dp dp[i]为第i为最大的子数组和
    let dp = [nums[0]]
    // 状态转移方程 dp[i] = max(dp[i-1]+nums[i], nums[i]),前面最大和加上当前这个数的结果于当前这数比大小
    let maxVal = nums[0]
    for(let i=1;i<nums.length;i++){
        dp[i] = max(dp[i-1]+nums[i],nums[i])
        maxVal = max(dp[i], maxVal)
    }
    console.dir(dp)
    return "最大子数组和为:"+maxVal+"\n"
}
/*
 结果为: 6 ([4,-1,2,1])
*/
function max(a,b){
    return a > b ? a : b
}

结语:

动态规划的解题思路就是化大问题为小问题。像此题,先求出1个元素时的最优解,通过第一个最优解去推出2个元素时的最优解,通过第二个最优解继续推出3个元素时的最优解。直到第n个。

解决最大子数组之和的三种方法 所谓最大子数组问题,就是在给定的一串包含正数,负数的数组中,找出最大的子数组的和例如:输入:1,-2,3,10,-4,7,2,-5最大子数组和为18一般而言,有三种办法可以用于解决这个问题1.暴力破解法暴力破解法就是将所有的子数组的和全部加起来,取最大的算法最简单,但是时间复杂度最高时间复杂度:O(n)=n^3var sum=-1000; for (var i=0;i&lt;arr.length;... 阅读详情

相关推荐

动态规划——求最大子数组和

1、问题:有一个整数数组arr,请找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。 2、解题思路:(实例解说) 例如: arr[100]={5,7,-15,2,-3,6} 最大子数组和为:12 核心思路: 以每一个数字做为子数组的结尾数字,向前做加法,如果前面的子数组和大于0,则继续加上,如果前面的子数组的和小于0,则此时子数组和为自身。这话说得有点不清楚,我们直接看实例就明白了。 过程分析: ...

m0_57526824的博客 2964

LeetCode 一题多解 | 53. 最大子数组和:五种解法完全手册

作者:nettee 公众号:面向大象编程一、原题描述 LeetCode 53. Maximum Subarray 最大子序和二、全部解法 本文将介绍「最大子数组和」...

nettee的专栏 1509

简单的动态规划算法:最大子数组和

DP:最大子数组和问题描述:算法及其思想:复杂的DP方法:简单的DP方法:参考: 问题描述: 给定一个无序数组,a1,a2,...ana_1,a_2,...a_na1​,a2​,...an​,请给出它的所有连续子数组中,各个数字和最大的一个子数组.(只给出最大的子数组和即可) EG:给定,[-2,1,-3,4,-1,2,1,-5,4],得出其最大子数组和为6,该子数组为[4,-1,2,1]. 算法及其思想: 复杂的DP方法: 思想:  顺序扫描每一个数组值A[i],并且维护三个变量–maxSum,ex

qq_43116414的博客 220

动态规划——子数组问题

然后如果 i 位置元素s[i - 1] == s[i] || (s[i - 1] == z && s[i] ==a)说明以 i 位置结束的字符串也在base中出现了,出现次数是dp[i - 1]。如果 i,i-1,i-2 位置元素能构成一个等差数列,那就是在以 i-1,i-2 位置元素为结尾的等差数列后面在加一个 i 位置元素,这些数列也是构成一个等差数列,以 i-1,i-2 位置元素为结尾就相当于以 i-1 位置元素为结尾,而以 i-1 位置元素为结尾的等差数列的个数,就在dp[i-1]里存着。

zdlynj的博客 3369

动态规划套路:最大子数组和

动态规划套路:最大子数组和 文章目录动态规划套路:最大子数组和一、题目描述二、分析 一、题目描述 这次看一个简答的题: 二、分析 这道题比较简单,主要是回顾动态 规划的解法! 其实第一次看到这道题,我首先想到的是滑动窗口算法,因为我们说过,滑动窗口算法就是专门处理子串/子数组问题的,这里不就是子数组问题么? 但是,稍加分析就发现,这道题还不能用滑动窗口算法,因为数组中的数字可以是负数。 滑动窗口算法无非就是双指针形成的窗口扫描整个数组/子串,但关键是,你得清楚地知道什么时候应该移动右侧指针来扩大窗

wolfGuiDao的博客 771

【忍者算法】从股市走势到动态规划:探索最大子数组和问题|LeetCode 53 最大子数组和

点此看全部题解更多干货,请关注公众号【忍者算法】,回复【刷题清单】获取完整题解目录~

忍者算法的博客 1083

动态规划:最大子数组和问题

最大子数组和问题是动态规划的经典入门问题,掌握它不仅有助于理解动态规划的基本思想,也能帮助我们更好地学习其他动态规划问题。希望这篇文章对大家有所帮助,祝大家刷题愉快!本文由 cannonjinx 原创,转载请注明出处。

cannonjinx的博客 1018

极坐标格式算法(PFA)-SAR成像算法系列(六)

SAR成像算法:极坐标格式算法,介绍了算法的基本原理以及实现步骤,包含dechirp处理、RVP补偿,距离插值、方位插值。文后附有代码,可根据自身情况下载。

yjh_2019的博客 1万+

LeetCode 53 最大子数组和:原来动态规划可以这么简单

本文以LeetCode 53题"最大子数组和"为例,揭示动态规划背后的简单逻辑。核心思路是:对于每个数字,只需判断是接上前面的连续子数组更优,还是从当前数字重新开始更优。通过示例数组逐步演示决策过程,最终得出最大和6的连续子数组[4,-1,2,1]。代码实现仅需维护两个变量(当前和与历史最大和),时间复杂度O(n),空间复杂度O(1)。这道题融合了动态规划和贪心的思想,关键在于理解"若前面累计和为负数就舍弃"的简单原则,避免死记硬背公式。

qq_53362375的博客 226

Ansys Zemax | 公差分析中的补偿器优化:如何提升系统良率?

本文深入探讨了在Ansys Zemax公差分析中如何有效设置与优化补偿器以提升系统良率。文章指出,补偿器是连接理想设计与现实生产的关键,通过模拟实际装配中的调整(如后焦距),能显著改善公差分析的“悲观”预测。详细介绍了补偿器的添加方法、多补偿器策略、评价函数设计以及通过灵敏度分析和蒙特卡洛档案优化补偿效果,旨在帮助光学工程师制定更符合生产实际的公差策略,从而有效提升产品良率。

weixin_28419039的博客 619

Simulink与CANape联动教程:模型调试阶段如何快速标定参数观测信号

本文详细介绍了如何通过Simulink与CANape联动,实现模型参数的实时标定与信号观测,从而避免反复编译,提升开发效率。核心在于正确配置Simulink中的标定量与观测量,生成A2L描述文件,并利用XCP协议建立通信,为新能源汽车与自动驾驶系统的快速原型开发提供高效解决方案。

weixin_29006187的博客 376

《算法题讲解指南:动态规划算法--子数组系列》--19.最大子数组和,20.环形子数组的最大和

本文讲解了两道动态规划算法题:最大子数组和与环形子数组最大和。对于最大子数组和问题,采用线性DP方法,定义dp[i]为以i结尾的子数组最大和,通过比较单独取当前元素或与前驱子数组组合来递推求解。环形子数组问题则分为两种情况处理:普通子数组最大和或跨越首尾的子数组和(总和减去最小子数组和),需注意全负数时的特殊情况处理。两题都详细说明了状态表示、转移方程、初始化、填表顺序和返回值等关键步骤,并提供了C++实现代码。

2501_91275995的博客 458

华为防火墙NAT避坑指南:当双ISP出口遇到服务器发布,这些细节不注意会翻车

本文深入解析华为防火墙在双ISP出口环境下服务器发布的实战配置,重点探讨no-reverse参数对Server-Map表的影响、源进源出功能的实现及线路切换时的会话保持问题。通过策略路由和智能选路技术,确保HTTP/FTP服务在多运营商链路中的高可用性,避免路径不对称和NAT映射冲突等常见陷阱。

weixin_30897233的博客 548

最大子数组和算法全解析:从暴力枚举到动态规划优化

本文系统探讨了最大子数组和问题的多种解法。从暴力解法(O(n³))到优化暴力解法(O(n²)),最终提出最优的动态规划解法Kadane算法(O(n))。文章详细分析了Kadane算法的状态转移方程和贪心选择性质,并提供了C++实现代码。进一步扩展讨论了环形数组、二维矩阵、多解情况和乘积问题等变种,展示了如何将基础算法思想应用于更复杂场景。通过时间复杂度对比和实际应用场景分析,论证了Kadane算法的高效性和实用性,为算法学习者提供了从基础到进阶的完整学习路径。

ambition20242的博客 446

低成本实现webhook接收端[python]

Webook本质上也是API,只不过是反向调用,即前端不主动发送请求,完全由后端推送。简单来说,Webhook是一个接受HTTP POST或是GET,PUT,DELETE的URL,一个实现了Webhook的API提供商就是在当事件发生的时候会向配置的URL发送信息,与请求-响应式不同,使用Webhook可以实时接收到变化。Ps:Webhook可能会发出大量的请求,确保接受的URL不被泄露或者应用能及时处理这些请求。

锡城小凯的博客 1万+

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

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

weixin_42545503的博客 336

我理解的算法 - 53.最大子数组和(超经典多种解法:强推、动态规划、Kadane算法)

题目:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 从暴力解法开始,然后以推算来演算出规律,再以动态规划以及Kadane算法来解释这道题目...

卡卡尔的专栏 634

Allegro172版本如何在联机模式下使用skill文件操作指导

注意:如果下次重新开启Symphony模式的时候可能导致symphony_skill中的文件内容被清空,所以最好将自己常用的skill文件都写到symphony_skill.txt中去,然后做好备份,需要的时候,在开启软件后把文件放到env目录中去。在用Allegeo172版本进行PCB设计的时候,有时会用到Symphony模式进行多人实时在线协同设计,如下图。这个模式设计起来可以提升设计速度,但是也有一个缺陷,就是不能使用skill文件。如下图,当调用skill的时候就会出现如下报错。

weixin_54787054的博客 1586

leetcode53:动态规划的最大子数组和

【代码】leetcode53:动态规划的最大子数组和。

m0_59412894的博客 210

RHEL 8 与 RHEL 7 与 RHEL 6 的比较,RHEL 8强到离谱!

Red Hat Enterprise Linux(RHEL)是企业级 Linux 发行版中最受欢迎的操作系统之一。RHEL 为服务器和企业环境提供了高性能、稳定性和安全性,适用于各种数据中心和云计算平台。自 RHEL 6 以来,Red Hat 对其操作系统进行了多次重大更新,RHEL 7 和 RHEL 8 带来了许多新的特性、工具和架构变化。

网络技术联盟站 707

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LeetCode 例题精讲 | 16 最大子数组和:子数组类问题的动态规划技巧

来源:面向大象编程 本期例题: LeetCode 53. Maximum Subarray Sum 最大子数组和(Easy)LeetCode 718. Maximum Length of Repeated Subarray 最长公共子数组(Medium) 在前面的文章中,我们分别讲解了一维和二维动态规划问题的解题步骤与基本思路。不过,仅仅掌握...

墨鱼菜鸡 287

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

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

【动态规划:子数组/子串系列】最大子数组和 && 环形子数组的最大和

本文介绍了解决最大子数组和问题的动态规划方法,并扩展到环形数组场景。对于普通数组,通过维护dp[i]表示以i结尾的子数组最大和,同时用ret记录全局最大值。环形数组则采用"正难则反"策略,分别计算普通子数组最大和与中间部分最小和,最终取两者与总和减去最小和的较大值。文中给出了两种实现方式:常规DP和空间优化版,时间复杂度均为O(n)。

lirendada的博客 1188

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

leetCode:最大子数组和(动态规划 简单题)

题目描述: 收获: 数组中可能存在负数,所以之前写的程序在此处不适用 【LeetCode】最大子数组和(动态规划、分治法)_凝眸伏笔的博客-优快云博客_leetcode 最大子数组之和LeetCode第53题地址。题目描述:给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。例子:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。解题:动态规划解题:递归...https://

m0_57422141的博客 298

算法:动态规划 最大连续子数组和 Maximum Subarray

题目 53. Maximum Subarray Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum. Follow up: If you have figured out the O(n) solution, try coding another solution using the div

AI架构师易筋 590

最大子数组和:动态规划

Problem: 53. 最大子数组和 文章目录思路解题方法复杂度优化前:code优化后:Code,直接在原来数组基础上改动 思路 首先就是赋予dp[0]为nums[0],然后循环遍历数组判断dp[i-1]是否小于0,如果小于0那么dp[i]就是nums[i],负责dp[i]就是dp[i-1]+nums[i],这样就可以保证每个dp[i]都是目前序列的最大值,最后返回最大的dp[i]就好 解题方法 描述你的解题方法 复杂度 时间复杂度: 添加时间复杂度, 示例: O(n)O(n)O(n)

justleavel的博客 584
上一篇: 动态规划:爬楼梯问题
下一篇: 动态规划:打家劫舍
jayLog
博客等级 码龄7年 318粉丝 71原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jayLog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值