算法题:连续子数组的最大和,分析过程(动态规划)

算法题(九):数组中连续子数组的最大和 方法一:可以从头到尾遍历,遍历过程中,对以每个元素开头的子数组求连续最大和,最后从各个最大和中找出最大的。 方法二:使用动态规划的方法,先以第一个数为局部最大和整体最大值,之后遍历数组,累加到局部最大值上,若新加上的数比局部最大值还要大,则把这个新数作为局部最大值,直到遍历结束;遍历过程中,若局部最大值大于整体最大值,则赋值给整体最大值。   /** * 遍历数据 * @... 阅读详情

题目描述

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

题目分析

记下标0到i的子向量最大和为ans[i],subRight[i]为以下标为i的元素结尾的所有子向量最大和,可以很容易得到,ans[i] = max(ans[i-1],subRight[i]),因为ans[i-1]由所有不包含array[i]的元素的子向量计算得出,subRight[i]由所有包含array[i]的元素的子向量计算得出。

那么题目的目标就是算出ans[array.length-1],怎么算a[i]?利用ans[i] = max(ans[i-1],subRight[i])即可,那么怎么算出subRight[i],首先subRight[0]一定是array[0],其他情况可以这样得出:如果subRight[i-1]>0,加上array[i]就可以,如果subRight[[i-1]<=0, 要得到最大的,还不如array[i]自己一个组成一个子向量。

由此可以在一次遍历得出答案,时间复杂度o(n)

代码实现

 //子向量最大和ans[i]可以由Max(ans[i-1],以array[i]结尾的所有子向量最大和) 计算得出
    public int FindGreatestSumOfSubArray(int[] array) {
        if(array == null){
            return 0;
        }
        int[] subRight = new int[array.length]; //这个数组的意义是 subRight[i] 为以array[i]结尾的所以子向量的最大和
        for (int i = 0; i < subRight.length; i++) {
            subRight[i] = 0; //初始化
        }
        int ans = Integer.MIN_VALUE;
        for (int i = 0; i < array.length; i++) {
            if(i == 0) //一开始先用array[0] 作为subRight[0]
                subRight[i] = array[i];
            else
                subRight[i] = subRight[i-1]>0?subRight[i-1]+array[i]:array[i]; //不是开始,如果以左边元素结尾的子向量最大和大于0
                                                                               // 则用左边结尾的子向量最大和加当前的值作为这里结尾的最大子向量最大和
                                                                               //否则自己一个元素作为一个子向量
            ans = Math.max(ans,subRight[i]); //与上一次得到的ans比较,相当于ans[i] = max(ans[i-1],subRight[i])
        }
        return ans;
    }
【算法题】连续子数组最大和问题分析与实现 最大子数组和问题是一个经典的算法问题,通过Kadane算法可以在O(n)时间内解决。这个算法的核心思想是动态规划,但通过优化可以将空间复杂度降至O(1)。在实际应用中,这种算法可以用于股票分析、信号处理等需要寻找最佳连续区间的场景。 阅读详情

相关推荐

手把手实战:RK3588上YOLOv8模型从训练到部署全流程解析

本文详细解析了在RK3588开发板上部署YOLOv8目标检测模型的全流程。从模型训练、正确导出适配的ONNX格式,到使用RKNN-Toolkit2进行模型转换与量化,最后在板卡上完成部署与性能测试。文章提供了完整的代码示例和关键避坑指南,帮助开发者高效实现嵌入式AI应用落地。

weixin_28224217的博客 404

动态规划算法(连续子数组最大和,O(N)时间复杂度O(1)空间复杂度) 【更新于:2018-05-13】

这个题目最早在13年阿里笔试出现,直到前两天面试另一家电商又出现,哎,欠的都是要还的。 这个问题的思路如下:一维数组的下标连续的元素构成连续子数组,求所有连续子数组中和最大的那个子数组。 解析:2018-11-08 1 首先这个问题要转化为Q(n)的问题,对于Q(n)的问题要转化成Q(n) = Q(n-1) + An的问题。 2 只要能意识到这一点,其实就可以有希望在O(n)的时间内解决,...

C++ 爱好者 make_it_simple888 4915

使用同一个时钟源clki,做两个二分频时钟,得到div2_clk1和div2_clk2,这两个时钟都能跟源时钟clki同步,但是div2_clk1和div2_clk2的相位可能是相同的,也可能是反相

比如,触发器1的初始Q为0,而触发器2的初始Q为1(这可能由于芯片制造工艺的微小差异、上电过程的随机性、或没有全局复位信号导致)。这句话的意思是:虽然div2_clk1和div2_clk2都是由同一个妈妈(clki)生出来的,频率也都是妈妈的一半,但它们“起步”的时刻可能不同。所以,上面那段话是在提醒你注意这种潜在的、由分频产生的时钟相位关系的不确定性,这在异步电路设计或时钟管理中是必须考虑的关键因素。结果:div2_clk1和div2_clk2的波形完全重合,它们的上升沿和下降沿都发生在同一时刻。

m0_49540263的博客 591

连续子数组最大和问题(扫描法改进)

问题描述输入一个整形数组,求数组中连续的子数组使其和最大。比如,数组x 应该返回 x[2..6]的和187.Kadane算法简介对于连续子数组求取最大和问题有很多种方法,时间复杂度和空间复杂度都很优秀的当属Kadane算法,该算法又被称为扫描法,该算法用到了一个启发式规则:如果前面一段连续子数组的和小于0,那么就丢弃它。我发现该算法无法正确的应用到全负数的数组中,并且只是单单的返回了连续子

Ron的专栏 803

从AAAI 2025被拒到ACM MM 2025录用:我的论文投稿经验与教训总结

本文分享了作者从AAAI 2025被拒到ACM MM 2025录用的论文投稿经验与教训。详细解析了格式要求、可复现性清单等关键细节,提供了精准转投策略和提升录用概率的实用技巧,帮助研究者避免常见错误并优化投稿策略。

weixin_29207533的博客 502

阿里云习题多选部分459道

比如: UserA的用户在杭州有一台经典网络的ECS云服务器InstanceA (内网IP: A.A.A),InstanceA所属的默认安全组为GroupA, UserB的用户在杭州有一台经 典网络的ECS云服务器InstanceB(内网IP:B.B.B),InstanceB所属的默认安全组为GroupB。43.创建阿里云的云服务器ECS实例之前,需要对ECS实例的配置进行选型,阿里云为用户提供了推荐的配置组合方案来满足大部分用户的需求,这些推荐配置只是作为开始使用云服务器ECS实例的参考。

2501_91384465的博客 1309

剑指offer:连续子数组的最大和(动态规划)

其实就是个动态规划问题,找出递推关系即可。 如果我们用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max(f(i)) 可以有以下公式: F(i) = array[i] if i == 0 or f(i - 1) < 0 F(i) =F(i- 1) + array(i) if i > 0 and F(i-1) >0 a ...

qq249356520的博客 1177

Cursor锁机了怎么办?实测这个开源插件帮你无限“续杯”,附详细安装与防踩坑指南

本文提供了Cursor锁机问题的详细解决方案,包括使用开源插件`cursor-fake-machine`修改机器标识、锁定配置文件权限以及优化使用规范。同时介绍了如何利用Cursor开发油猴脚本将微信公众号文章高效转换为Markdown格式,提升内容创作效率。

weixin_26805597的博客 766

连续子数组的最大和(动态规划)

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

weixin_44376490的博客 1730

Unity Hololens2开发|(一)环境配置

开发过程中预览和调试应用:可以在电脑上的 Unity 编辑器中以播放模式本地运行应用,并将体验流式传输到 HoloLens2。将来自 HoloLens2 的输入(视线、手势、语音和空间映射)发送到电脑,在其中内容以虚拟沉浸式视图渲染。在HoloLens2设备中,打开Settings面板,依次选择Update & Security > For Developers,打开“Developer Mode”。在开发计算机中打开控制面板,依次选择“更新和安全> 开发者选项”,打开“开发人员模式”;

游戏开发小Y的博客 14万+

基于STM32、HAL库的BMP585 气压传感器 驱动程序设计

define BMP585_I2C_ADDR_PRIMARY 0x76 << 1 /* 0x76地址左移一位 */#define BMP585_I2C_ADDR_SECONDARY 0x77 << 1 /* 0x77地址左移一位 *//* I2C句柄 *//* I2C地址 *//* 设置新的温度过采样率 *//* 设置新的滤波器系数 *//* 芯片ID *//* 清除温度过采样位 *//* 转换为hPa *//* 设置新的压力过采样率 *//* 设置新的电源模式 *//* 清除压力过采样位 */

corlin6688的博客 459

连续子数组的最大和问题(五种解法)

昨天软考(2021年5月29日)试卷上出现了的算法题,问:连续子数组最大和的分治解法的时间复杂度,考完正好总结一下这道算法题。 求连续子数组的最大和 题目描述: 输入一个整型数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 比如上面这个数组的子数组的最大和为187,从下标3到下标7的位置。(本文中数组下标从1开始) 思路 比较常规的思路是暴力(O(n3))、前缀和数组(O(n2))两种,但是时间复杂度比较高,这题也可以用分治的策略做,时间复杂度O(nl.

weiambt的博客 3万+

杰理SDK UART 使用教程

本文介绍了JL701n芯片的UART串口通信使用教程,重点讲解了UART2的初始化配置、数据收发和中断处理功能。教程详细说明了代码结构、核心功能函数、配置参数和使用步骤,包括UART初始化、数据发送和接收中断处理等关键操作。同时提供了完整的API接口说明和注意事项,强调了中断处理限制、缓冲区管理、引脚配置等重要细节。最后给出了基本使用流程和高级任务处理示例,并针对常见问题提供了故障排除建议。本教程适用于需要在JL701n芯片上实现可靠串口通信的开发者。

qq_42014563的博客 1817

求数组中连续子数组的最大和

LeetCode的一道算法题: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 分析: 我们可以假设数组的第一个元素认为是最大和maxSum,定义数组求和变量int sum = 0,则可以依次向后累加数组中其他元素sum += nums[i],如果sum < 0,则将sum = nums[i],因为sum &l

薄红的博客 2594

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Python 算法题之 子数组的最大和

Python 算法题之 子数组的最大和 文章目录Python 算法题之 子数组的最大和给出题目 暴力算法动态规划参考资料 相关博客 给出题目 暴力算法 def maxSubArray(self, nums: List[int]) -> int: max_res, length = float("-inf"), len(nums) for i in range(length): res = 0

贤哲XianZhe的博客 2018

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LeetCode刷题--- 环形子数组的最大和

给定一个长度为n的环形整数数组nums,返回nums的非空子数组的最大可能和。 环形数组意味着数组的末端将会与开头相连呈环状。形式上,nums[i]的下一个元素是nums[(i + 1) % n],nums[i]的前一个元素是nums[(i - 1 + n) % n]。 子数组最多只能包含固定缓冲区nums中的每个元素一次。形式上,对于子数组nums[i], nums[i + 1], ..., nums[j],不存在i

元清的博客 2011

Devexpress16.2.6破解工具

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

python算法每日一练:连续子数组的最大和

dp[i-1] 的含义。在遍历数组 nums 的过程中,我们计算 dp[i] 的值,表示以 nums[i] 结尾的连续子数组的最大和。我们需要选择使 dp[i] 达到最大的方式,因此我们比较这两种情况的结果,取较大的值作为 dp[i] 的值。将 nums[i] 与前面的连续子数组相连,此时 dp[i] = dp[i-1] + nums[i]。nums[i] 单独构成一个子数组,此时 dp[i] = nums[i]。解释:连续子数组 [4, -1, 2, 1] 的和最大,为 6。

qq_42476938的博客 526

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

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

2501_91275995的博客 458

【算法题】动态规划基础阶段之斐波那契数列、青蛙跳台阶问题、连续子数组的最大和

动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;

Lion_Long的博客 698

算法题--动态规划(连续子数组的最大和、丑数、n个骰子的点数)

1个骰子时,每个点数的组合数为[1,1,1,1,1,1],概率在组合数上除以6,添加一个骰子,点数为2~12,每个点数的组合数为少一个骰子的组合数加1~6,例如点数5为1+4,2+3,3+2,4+1,即组合数的和为4。首先确定初始值res[0]=f(0),然后找到上下层res[i]和res[i+1]的关系,通过for循环递归解出arr[n]的值,找上下层关系的时候可以去列举res[0],res[1],res[2]...列举初始的前几位,找到对应的关系。输入:[1,-2,3,10,-4,7,2,-5]

AIWWY的博客 321

动态规划 - 子数组系列

文章摘要:动态规划在子数组问题中的应用主要针对寻找具有特定性质的连续子数组(如最大和、最长长度等)。典型解法包括:1)最大子数组和(dp[i]记录以i结尾的最大和);2)乘积最大子数组(需同时维护最大/最小乘积dp表);3)环形子数组(分内部和首尾相连两种情况处理);4)湍流子数组(用两个dp表分别记录上升/下降状态)。关键思路是定义dp[i]为以第i个元素结尾的子数组最优解,通过状态转移方程逐步求解。不同问题需结合正负号、环形结构等特性调整状态表示和转移逻辑,最后注意去重和边界处理。

Small_entreprene的博客 749

算法题:求连续子数组最大和

求连续子数组最大和 输入一个整形的数组,数组中有正数也有负数,数组中一个或者多个组成一个子数组,求子数组和中的最大值 输入 1,2,-3,5,6,3,-2,3,-10,2 输出 15 输入1,2,3,5,6,3,2,3,10,2 输出 35 -2, - 4,-3,-6,-6,-8,-2,-1,-10,-2 输出 -1 思路 寻找规律,发现数组只要相加不小于等于0,就可以继续相加,否则从0开始 int arr_max(int buf[],int len) { if (buf == nullptr

dongdong7_77的博客 273

【每日一题】连续最大和

题目来源 牛客网 链接:连续最大和 题目描述 一个数组有N个元素,求连续子数组的最大和。例如:[-1,2,1],和最大的连续子数组为[2,1],其和为3 输入描述: 输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。 输出描述: 所有连续子数组中和最大的值。 输入: 3 -1 2 1 输出: 3 解题思路 本题题意很简单,就是求哪一段的子数组的和最大。 假设sum[i-1

zhao_leilei的博客 870

具有最大和的连续子数组(动态规划法)

题目: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 思路:动态规划超详细分析 class Solution { public: int maxSubArray(vector<int>& nums) { int max = nums[0]; //全

weixin_44392955的博客 1181

【LeetCode:1186. 删除一次得到子数组最大和 + 动态规划 + 前后缀数组】

【LeetCode:1186. 删除一次得到子数组最大和 + 动态规划 + 前后缀数组】给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。 注意,删除一个元素后,子数组 不能为空。

Coder_ljw的博客 928

深信服手撕算法题—连续子数组的最大和

连续子数组的最大和 题目描述如下: 第一次我做的思路是用两个for循环遍历,写完以后面试官说你这么写是有问题的,会超时。由于面试时间比较紧张,就叫我私底下再好好想想。 最好的做法是用动态规划算法 时间复杂度为0(N) public int maxSubArray(int[] nums) { int[]dp = new int[nums.length]; //动态规划列表 dp, dp[0] = nums[0]; int res = nums[0];//全局最大值 for(i

xiehert的博客 542
上一篇: 算法题:数组中出现超过一半的数字 题目分析
下一篇: sql查询学生大于平均值的成绩
Baibair
博客等级 码龄8年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值