[剑指OFFER]之动态规划:JZ42 连续子数组的最大和

剑指offer所有编程练习总结分析 给出剑指offer所有题目描述和对应的解题思路,并且在最有给出对应的代码展示和测试内容 由于牛客剑指Offer题目经过整理和筛选,是面试备考的经典资源之一,因此它的重要性在面试准备过程中是很高的。做这些题目可以帮助面试者熟悉常见的面试题型、巩固基础知识、提升编程能力,为应对面试提供了很好的准备。然而,还需注意不仅仅局限于做题,理解背后的原理和思想同样重要,以便能够在面试时灵活运用和展示自己的能力。 阅读详情

终于到动态规划了,动态规划是聪明地暴力计算。

动态规划题目,一般是求最值。

其核心是建表和查表,自顶向下模式一般使用 递归+备忘录(备忘录就是表),自底向上一般是 动态维护一张表,或者数组。

我觉得最难的是建表,就是定义,这张表代表什么! 一般来说数组的维度代表问题条件的参数,这张表可能是一维数组、二维数组、甚至三维数组。我们需要理解问题,找到能够使用数学归纳法的公式,即状态转移方程,来迭代计算。

关于空间压缩:由于很多的时候我们在迭代计算时并不需要表的数据,只需要前若干项数据即可,所以就可以进一步压缩空间吗,通过变量替换数组。

那么,如果要提升动态规划解题能力,就需要了解其核心思路,并多练习。

1.题目

输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。

注意:-100 <= a[i] <= 100

1.1 要求完成

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {

    }
}

2.解法

首先我们要区分子数组和子序列的区别:子数组要求元素必须是连续的,比如原数组1,2,3,4,5 那么 子数组可以是其中任意连续的一部分。但是比如1,3,5就是子序列了,而不是子数组。

2.1 解法1

构建一个一维数组int [] dp = new int[array.length] 。

dp[i] 表示 以array[i]结尾的连续子数组的最大和。

如下图,如果能够构建dp,那么答案就是dp数组中的最大值,它就是答案。
在这里插入图片描述
构建一个元素,先从dp[0]开始,dp[0]一定是array[0]。
从下一个元素开始,就会挑剔,看dp[i-1]是不是负值,如果是负值,就不考虑,否则就加上前一个dp[i-1]。
最后就查找整个dp数组的最值。

    public int FindGreatestSumOfSubArray(int[] array) {
        if (array == null || array.length == 0) return 0;
        int[] dp = new int[array.length];
        dp[0] = array[0];
        for (int i = 1; i < array.length; i++) {
            if (dp[i - 1] < 0)
                dp[i] = array[i];
            else
                dp[i] = dp[i - 1] + array[i];
        }
        int max = Integer.MIN_VALUE;
        for (int a : dp) {
            if (a > max) max = a;
        }
        return max;
    }

2.2 解法2

分析解法1,max元素无需两次遍历,在第一次遍历时就可以获取。
因此,我们只要能够正常往前迭代即可,因此可以节约dp数组的空间使用,通过cur元素代表dp[i]。

    public int FindGreatestSumOfSubArray(int[] array) {
        int max = Integer.MIN_VALUE;
        int cur = 0;
        for(int i=0;i<array.length;i++){
            cur +=array[i];
            max = Math.max(cur,max);
            if(cur<0) cur=0;
        }
        return max;
    }

总结

dp[i] 表示 以array[i]结尾的连续子数组的最大和。这是核心。

算法系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/alg
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

feko金属球远场RCS双站 阅读详情

相关推荐

从零构建:基于OpenCV与人体姿态分析的跌倒检测实战(附完整源码)

本文详细介绍了如何从零构建基于OpenCV与人体姿态分析的跌倒检测系统,包含完整源码与部署指南。通过MediaPipe实时检测33个人体关键点,结合多条件联合判断算法,实现高精度跌倒识别。文章还提供了性能优化技巧、常见问题解决方案以及家用与养老院两种部署方案,帮助开发者快速落地这一计算机视觉应用。

weixin_29085151的博客 240

523. 连续的子数组和

时间 2021年6月2日 题目 给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组: 子数组大小 至少为 2 ,且 子数组元素总和为 k 的倍数。 如果存在,返回 true ;否则,返回 false 。 如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。 示例 1: 输入:nums = [23,2,4,6,7], k = 6 输出:true 解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。 示例

qq_38827988的博客 358

CHARLS数据库下载避坑指南:从注册到数据获取的完整流程(2023最新版)

本文提供2023年最新版CHARLS数据库下载与使用全流程指南,涵盖从注册、数据申请到清洗的高效实践。重点解析邮箱选择、协议签署等关键步骤,并分享多线程下载、格式转换等实用技巧,助力研究者快速获取并处理这一中国中老年健康研究的黄金标准数据。

red88的博客 919

剑指offer(C++)-JZ42:连续子数组的最大和(算法-动态规划)

C++实现——连续子数组的最大和(算法-动态规划)

翟天保的博客 1万+

华硕ROG枪神双系统实战:Ubuntu安装避坑指南

本文是华硕ROG枪神笔记本安装Ubuntu双系统的详细避坑指南。针对其独特的硬件与BIOS设计,文章核心解决了VMD控制器导致硬盘无法识别、驱动兼容性等关键难题,并提供了从BIOS设置、分区方案到安装后驱动配置与性能调优的一站式解决方案,帮助用户实现稳定的双系统体验。

raspberrypi5的博客 545

元数据管理:DataHub和OpenMetadata对比分析

DataHub和OpenMetadata都试图解决数据编目,搜索,发现,治理和质量方面的相同问题。这两种工具都是出于为需要支持大量数据源、团队和用例的大型组织解决这些问题而诞生的。尽管这些工具在发布历史和成熟度方面略有不同,但它们的功能存在显着重叠。

weixin_38030820的博客 6632

【剑指offer】<动态规划--简单>【JZ42 连续子数组的最大和】

输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

预备的小小CV算法工程师 342

做形态学方法的团队_“设计形态学”与“第三自然”

文/邱松(清华大学 美术学院)摘要:“设计形态学”是基于“形态学”研究的设计基础学科。“形态”既是该学科研究的主体,又是与其它学科相连接的“纽带”。实际上,不管是供养我们的地球家园,还是神秘莫测的浩瀚宇宙,均由数量纷繁、千姿百态的“形态”构筑而成。形态通常被分成两大类:一类是源于“第一自然”的“自然形态”;另一类是来自“第二自然”的“人造形态”。而这两类形态正是“设计形态学”研究的两条...

weixin_31548723的博客 2683

【动态规划】【打卡117天】:《剑指Offer》 2刷:JZ42 连续子数组的最大和

1、题目描述 输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 数据范围: 1 <= n <= 10^51<=n<=105 -100 <= a[i] <= 100−100<=a[i]<=100 要求:时间复杂度为O(n)O(n),空间复杂度为O(n)O(n) 进阶:时间复杂度为O(n)O(n),空间复杂度为O(1)O(1) 2、算法分析 题目求的是连续子数组中元素和的最大...

CodingLJ 527

保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南)

本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。

weixin_29168675的博客 284

汇川PLC用户程序结构详解:如何像搭积木一样配置多任务?附EtherCAT最佳实践

本文深入解析汇川PLC用户程序结构,阐述如何像搭积木一样,通过POU、FB、FC等模块化组件高效配置多任务。文章重点结合EtherCAT通讯场景,分享了任务周期、优先级设置的最佳实践与关键避坑指南,帮助工程师构建稳定、高效的运动控制系统。

weixin_29184075的博客 538

【刷题之路】牛客剑指offer JZ42 连续子数组的最大和

在求最长回文子串的时候当一个子串的长度增加时,只可能有两种情况增长后的字串不是回文串和是回文串,如果是回文串,那么最长回文串的长度就一定会增加。而现在我们求的最大子串总和当子串的长度增加时,总和有可能是减小的,因为在子串增长的时候后面又可能遇到的是负数。每求出一个dp[i],我们都将它与现已有的最大子串总和max_sum进行比较,当我们遍历完数组之后,我们就求出了连续子数组的最大和。枚举出所有的子数组,求出子数组中元素的总和,每次都跟已有的最大子数组元素总和max_sum进行对比。

kk702392702的博客 903

基于HetConv与Dual策略的YOLOv8轻量化设计-CSPHet结构的优化与实现

在计算机视觉中,YOLOv8作为目标检测领域的最新版本,通过引入多种改进来提升检测精度和速度。然而,提升精度和保持实时性能往往需要更多参数与计算量。本文提出一种结合Dual思想与HetConv的新型轻量化结构,称为CSPHet。CSPHet能够在保持YOLOv8检测精度的基础上有效减少约70万参数量,实现模型的轻量化和速度的提升。HetConv(Heterogeneous Convolution)是一种混合卷积技术,通过同时使用1x1、3x3等不同大小的卷积核,来捕捉不同尺度的特征。

博客 1324

【剑指offer-C++】JZ42:连续子数组的最大和

【剑指offer-C++】JZ42:连续子数组的最大和

❀雾里看花花里看雾❀ 267

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

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

剑指offer第2版:动态规划+记忆化搜索

前三题是同一种模型,所以我分别用递推、记忆化、动归来做

weixin_51142926的博客 4638

ssm框架搭建

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

《剑指offer》Java版题解:动态规划篇一

目录 前言 一、JZ42连续子数组的最大和 二、JZ85连续子数组的最大和(二) 三、跳台阶 四、JZ10斐波那契数列 五、JZ71跳台阶扩展问题​ 六、JZ70矩形覆盖 总结 前言 本篇文章记录本人练习《剑指offer》动态规划篇的心得与体会,题目来源于牛客网,语言选用Java,如有提议和建议,欢迎在评论区不吝赐教。感谢~ 一、JZ42连续子数组的最大和 题解思路: 这题如果不使用动态规划的思想的话,我们可以通过两次循环遍历...

weixin_56032340的博客 705

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

剑指offer(C++)-JZ85:连续子数组的最大和(二)(算法-动态规划)

C++实现——连续子数组的最大和(二)(算法-动态规划)

翟天保的博客 1万+

【剑指offer】JZ85 连续子数组的最大和(二)

说明:经分析可知,最大子数组的和为4,有[4],[4,-1,1],[1,2,-3,4],[1,2,-3,4,-1,1],故返回其中长度最长的[1,2,-3,4,-1,1]1.子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组。说明:经分析可知,输入数组的子数组[3,10,-4,7,2]可以求得最大和为18,故返回[3,10,-4,7,2]输入:[1,-2,3,10,-4,7,2,-5]输入:[1,2,-3,4,-1,1,-3,2]

LouHerGetUp的博客 412

剑指Offer:JZ30 - 连续子数组最大和(解题思路+Java代码)

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)

枫叶火火的博客 650

【剑指offer系列——JavaScript版】每日2题——连续子数组的最大和

【剑指offer系列——JavaScript版】每日2题——连续子数组的最大和,文章对其细节认真分析,希望帮助到刷题迷茫的小伙伴,大家一起学习进步!

qq_50497708的博客 439

【剑指offer-C++】JZ85:连续子数组的最大和(二)

【剑指offer-C++】JZ85:连续子数组的最大和(二)

❀雾里看花花里看雾❀ 682

《剑指offer》:动态规划

动态规划算法的基本思想 将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。动态规划算法将问题的解决方案视为一系列决策的结果 BM62 斐波那契数列 链接:斐波那契数列 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39。 思路...

u014509577的博客 445

【剑指offer】JZ42 连续子数组的最大和

因为数组中有正有负有0,因此每次遇到一个数,要不要将其加入我们所求的连续子数组里面,是个问题,有可能加入了会更大,有可能加入了会更小,而且我们要求连续的最大值,因此这类有状态转移的问题可以考虑动态规划。输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。说明:经分析可知,输入数组的子数组[3,10,-4,7,2]可以求得最大和为18。输入:[1,-2,3,10,-4,7,2,-5]要求:时间复杂度为 O(n),空间复杂度为。

LouHerGetUp的博客 109

剑指 Offer JZ30 连续子数组的最大和

题目描述 {6, -3, -2, 7, -15, 1, 2, 2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。 public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int max=Integer.MIN_VALUE; for(int i=0;i<array.length;i++){ int temp=array[

sinat_31089473的博客 190

【算法】解题总结:剑指Offer 30 连续子数组的最大和、剑指Offer 4 重建二叉树

JZ30 连续子数组的最大和 (简单) 题目 描述 输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。 示例 输入: [1,-2,3,10,-4,7,2,-5] 返回值: 18 说明: 输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。 思路 使用动态规划求解问题,最重要的就是确定从前一个阶段转化到后一个阶段之间的递推关系, 递推关系必

Zhou_LC的博客 236

剑指offer-刷题笔记-简单题-JZ42 连续子数组的最大和

版本1- class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { //int result; if(array.size() == 1) { return array[0]; }else{ int count = array[0];//从第一个数字开始累加

cmdxly的博客 685
上一篇: [剑指OFFER]之搜索算法:JZ44 数字序列中某一位的数字
下一篇: SpringSecurity简单入门
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

悟空学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值