最大子序和及乘积最大子数组

经典算法题:乘积最大子数组 题目 给你一个整数数组 nums,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释:子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释:结果不能为 2, 因为 [-2,-1] 不是子数组。 思路 动态规划 dp[i][j]:以 nums[i] 结尾的连续子数组的最值,计算最大值还是最小值由 j 来表示,j 就两个值; 当 j = 0 的时候... 阅读详情

题目链接:

最大子序和:https://leetcode-cn.com/problems/maximum-subarray/

乘积最大子数组:https://leetcode-cn.com/problems/maximum-product-subarray/

解题思路:

动态规划问题要满足三个条件,第一是最优子结构,第二是子问题重叠,第三是无后效性。最难的是找到状态转移方程。

两个题目的状态转移方程的关键点在于理解以第i个元素结尾的最大值。

举例说明:

测试数组为[1,7,-3,4]

以index=0即元素1结尾的子序列中和最大的为1(因为以1结尾的子序列仅有一个是[1])

以index=1即元素7结尾的子序列中和最大的是多少呢?以元素7结尾,则子序列一定包含7,最大值可能来自两个子序列

1、若要和其前面的元素连续起来组成子序列,则子序列中一定包含其前一个元素即1,而以index=i-1结尾的最大和我们已经求出来了,是max[i-1], 所以max[i]=max[i-1]+nums[i];

2、也有可能不与前面元素组成子序列,元素本身自己成为子序列,则max[i]=nums[i];

因此,max[i]=MAX(max[i-1]+nums[i],nums[i]);

 

class Solution {
    public int maxSubArray(int[] nums) {
        int ans = nums[0];
        int sum = 0;
        for(int num: nums) {
            sum = Math.max(sum+num, num);
            ans = Math.max(ans, sum);
        }
        return ans;
    }
}
class Solution {
    public int maxProduct(int[] nums) {
        int len = nums.length;
        if(len == 0){
            return 0;
        }
        int res = Integer.MIN_VALUE;
        int max_i = 1;
        int min_i = 1;
        for(int i = 0 ; i < len; i++){
            if(nums[i] < 0){
                int temp = max_i;
                max_i = min_i;
                min_i = temp;
            }
            max_i = Math.max(max_i*nums[i], nums[i]);
            min_i = Math.min(min_i*nums[i], nums[i]);
            res = Math.max(max_i, res);
        }
        return res;
    }
}

 

 

最大子数组乘积 给定一个n个元素的数组,数组元素全部为整数,负数,正数和0均有可能存在,设设计一个算法,找出连续的几个数组元素相乘积最大 立即下载

相关推荐

无人机巡检提速3倍!YOLOv8n+OpenVINO让Jetson Nano跑25FPS,还能多飞25分钟

摘要(149字): 针对无人机巡检中Jetson Nano算力不足导致的帧率低、首次推理延迟高、续航短等问题,提出YOLOv8n+OpenVINO联合优化方案: 模型轻量化:YOLOv8n参数量仅3.2M(较v8s减少71%),Jetson Nano帧率从8FPS提升至15FPS(原生),绝缘子裂纹召回率仅降3%; OpenVINO加速:AUTO模式动态分配CPU/GPU算力,首次推理延迟从500ms降至200ms,帧率再优化至25FPS; 能效提升:功耗降低40%,单次续航延长25分钟。方案已落地电力/林

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1241

Day7.乘积最大子数组--LeeCode练习

题目分析 给你一个整数数组nums,请你找出数组中乘积最大的子数组(该子数组中至少包含一个数字),并返回该子数组对应的乘积。 在前面我做过一个类似的问题,那个问题是加法的最大子数集。 代码 class Solution { public: int maxProduct(vector<int>& nums) { int minF=nums[0],maxF=nums[0],ans=nums[0]; for(int i=1;i<nums.size

qq_42082542的博客 366

Workbench中直接调用ICEM CFD进行网格划分

自从ANSYS 12.0之后,ICEM CFD就从Workbench中被分离出去,作为一个独立的程序使用了。取而代之的是Meshing模块。 在Meshing的属性节点菜单中右键点击Mesh,选择Insert > Method,插入方法。 选择需要划分网格的几何体,点击apply。此时Geometry显示为1 Body。 设置Method为MultiZone,如果不设置成这个的话,找不到进入ICEM CFD的入口。如果要划分四面体,可以在Mapped Mesh Type中选择其他类型。

Yan的博客 6509

乘积最大子数组

乘积最大子数组 /* f[i] = max(num[i], num[i] * num[i - 1], num[i] * num[i - 1] * num[i - 2],...) = max(num[i], num[i] * f[i - 1]); 从这里看与“53. 最大子序和”非常类似。但是乘法存在负负为正。因此,当num[i] < 0, f[i] = max(num[i], num[i] * f[i - 1]);其中需要f[i - 1] 位置应该是最小的。因此,定义g[i] 作为最小值。 此时:

Lily8888888的博客 203

MPU6050 加速度计和陀螺仪传感器与 Arduino 的接口

虽然该模型并不能准确代表现实世界中加速度计传感器的构建方式,但它通常有助于理解为什么加速度计的输出信号通常以 ±g 为单位指定,或者为什么加速度计在静止时在 z 轴上的读数为 1g,或者在不同方向上您可以期望得到什么样的加速度计读数。该模块的核心是低功耗、低成本的 6 轴运动跟踪芯片 MPU6050,它将 3 轴陀螺仪、3 轴加速度计和数字运动处理器 (DMP) 集成到一个 4mm x 4mm 的微型芯片中。小时候,科学博览会上的陀螺仪总是让我们感到惊讶,因为它们以奇怪的方式移动,甚至似乎违背了重力。

sxstj的博客 9931

node-red 可视化探索

配置socket选择配置流程产生url。

weixin_44133581的博客 3411

152. 乘积最大子数组

给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。在上面的这个过程中,我忽略了负值的情况,也就是说前面可能是负值,后面又乘了一个负值之后,就会变成一个较大的值。刚开始看到这道题,对其很是轻蔑,想着这不就是一道很入门的动态规划题目吗,还是老规矩,找状态转移方程。则有dp[i]=max{nums[i],nums[i]*dp[i-1]}即dp[i]表示到第i个结点对应的最大连续子数组的乘积。初始值dp[0]=nums[0]=2;......

zhiyikeji的博客 948

量子城域网系列(六):从星型到环形,解析QKD网络拓扑的演进与选型

本文深入解析了量子密钥分发网络从星型到环形等主流拓扑结构的演进历程与核心原理。针对量子城域网的实际部署,文章详细对比了星型、总线型和环形拓扑的优缺点,并结合政务云、金融网点等典型应用场景,提供了实战选型指南,帮助读者在物理限制、安全需求与成本效率间找到最佳平衡。

weixin_29197835的博客 111

pta7-3 二维数组最大值

pta7-3 二维数组最大值

m0_73896158的博客 4001

我的PCB设计经验总结及最容易犯错的100例之二B07

本文总结了PCB设计中的常见错误及解决方法。作者通过记录自身及他人的设计失误,系统归纳了高频、隐蔽且致命的问题,如电容中间穿线、高速信号跨分割、锐角布线等。重点提出从错误中提炼规律,建立分类案例库,并开发自动化检查工具的方法。案例涵盖高速信号处理、电源设计、EMC防护等关键领域,强调通过原理理解和实践验证提升设计质量。文章建议工程师建立个人错误数据库,从被动纠错升级为主动预防,最终形成系统化的设计方法论,提高PCB一次成功率。

启芯硬件的博客 82

调节桌面图标大小的方法(编程)

如果你对其他操作系统或编程语言有类似的需求,可以根据具体的情况进行相应的调整和搜索相关的库和方法。在编程中,我们可以使用各种桌面应用程序来调节桌面图标的大小。库提供的函数,我们获取了桌面图标的窗口句柄,并使用Windows消息发送方式设置图标的大小。你可以根据自己的需求修改代码中的图标大小值,并在运行代码后观察桌面图标的变化。函数并传入所需的图标大小,这里设置为48x48像素。首先,我们需要使用Python的第三现的方法。首先,我们需要使用Python的第三方库。首先,我们需要使用实现的方法。

CyberFlare的博客 437

java乘积最大子数组、最大子序和

class Solution { public: int maxProduct(vector<int>& nums) { int res = INT_MIN; int imax = 1, imin = 1; for (int i = 0; i < nums.size(); i++) { if (nums[i] < 0) swap(imin, imax);//如果数组的数是负数,那么会导致最大的变最小的,最小的变最大的。因此交换两个的值。 ...

tayloramanda的博客 195

HSM 网络安全 信息安全

HSM HSM信息安全功能 汽车电子网络安全中HSM 的应用场景 选择适合汽车电子网络安全的 HSM 符合汽车安全标准和法规要求的HSM HSM 在汽车电子网络安全中的可靠性和安全性 评估汽车电子网络的安全性 汽车 HSM(Hardware Security Module)模块开发 汽车 HSM(Hardware Security Module)模块测试

天赐好车的博客 1235

53. 最大子序和与152. 乘积最大子数组

53. 最大子序和与152. 乘积最大子数组 这两道题有相似之处,所以放在了一起记录 题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 思路 可以用动态规划来做,设数组元素f[i]表示包含第i个元素的最大和的连续子数组,那么转移方程是 f[i]=max(f[i−1]+A[i],A[i])f[i] = max(f[

1160200515的博客 195

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

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

刷题篇--最大子序和、乘积最大子数组

最大子序和 leetcode 53. 最大子序和,是经典动态规划问题。题目要求给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。如[-2,1,-3,4,-1,2,1,-5,4],连续子数组为[4,-1,2,1]和最大为6。 动态规划问题主要是写成转移方程,该题要做的选择是dp[i]要选择当前的nums值还是选择dp[i-1]+nums[i],是上一步加上当前nums更大还是目前的nums更大。 def maxSubArray(nums): if not

托比亚思的博客 360

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Leetcode】53.最大子序和&&152.乘积最大子数组 题解

这两道题有些相似,放在一起更方便以后查阅。 53.最大子序和 题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 题目链接 思路 这题可以采用动态规划解决。 设dp[i]为[0,i]内连续子数组最大和。对于nums[i]只有两种方式,取或者不取,若取nums[i]放入连续子数组,此时最大和为nums[i]+dp[i

要继续努力的孤独的博客 189

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...

乘积最大子数组、最大子序和

这道题如果限定数组元素全是非负数,那么就很简单了: 但是这题数组元素可以是负数,这就比较难想到了,参考别人的思路: class Solution { public: int maxProduct(vector<int>& nums) { int res = INT_MIN; int imax = 1, imin = 1; for (int i = 0; i < nums.size(); i++) { if (nums[i] < 0) swa.

ShenHang_的博客 498

lee152 乘积最大子数组 lee52 最大子序和

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 solution 看到示例发现有负数,所以要开始考虑如果负数出现,最小值就变成最大值,最大值就变成最小值,所以要多记录一个最小值,不能光记录最大值。 每次都要记录最大值i

mengmengkuaipao的博客 170

152.乘积最大子数组

题目 LeetCode 152 题 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 算法思路 最开始我用一个二维数组存放nums[i,j]的乘积,将所有i到j的乘积都计算出来存放在二维数组中,这样时间复杂度很高,会超

laoli的博客 296

❤️思维导图整理大厂面试高频数组14: 最大子序积 和 最大子序和 的不同之处, 力扣152❤️

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

孤柒的博客 1万+

leetcode-乘积最大子序和之动态规划

分析 一开始的想法其实没有错,先计算整个数组中负数的个数,看是奇数个还是偶数个; 若是偶数个,很简单,挨个乘就是了; 但若是奇数,就需要去检查当前是第几个负数等,代码写起来非常之麻烦; 其实这题和最大子序和有些类似,但是因为是乘法导致负数的影响很大; 多个正数的乘积的结果,也就是最大乘积遇到负数后,应当变成了最小乘积,再次遇到负数的时候,就再次变为最大; 我们需要同时维护:乘积最大子序和,乘积最小子序和; 而且动态规划的特点是“无后效性”: 无后效性是指如果在某个阶段上过程的状态已知,则从此阶段以后过程的.

weixin_40710708的博客 265

LeetCode53/152 最大子序和/乘积最大子序列

原题目 最大子序和: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。 来源:力扣(LeetCode) 链接:https...

忘之苡巛 203

LeetCode:152.乘积最大子数组

类似于前面的53题:最大子序和 设max(i) 为(0, i] 的最大子序乘积,由于该最大自序乘积有三种可能,max(i-1)可能是正数,负数;nums[i]也可能是正数,负数 如果是负数,要用(0, i]的最小值相乘 所以还需要设置一个函数:min(i)为(0, i]的最小子序乘积 可以得出如下的递推公式: max(i) = Math.max( max(i-1)*nums[i], Math.max(min(i-1)*nums[i], nums[i]) ); i>=1 min(i) ...

daqin_yinshi的博客 154

LeetCode 152.乘积最大子数组(Python)

给你一个整数数组 nums ,请你找出数组中乘积最大的子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。示例 1:输入: nums = [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: nums = [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

qq_43069203的博客 719

leetcode刷题(69)——152. 乘积最大子数组

一、题目 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 二、思路 这道题和leetcode 53.最大子序和相似,我们可以借鉴其思路: 在最大子序和问题中,我们定义状态 dp[i] 表示“以第 i 个元素结尾的子数

kezhou的博客 269

leetcode - 53. 最大子序和 152. 乘积最大子序列 - 两个算法之间的联系和区别

这两道算法题的解题思路是差不多的,但是从整体上分析,乘积最大子序列之和是最大子序和的进阶。先来看看两道算法题的简单描述。 —————————————————————————————————————————— 53.最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 ——————————————————————————————————...

然后就去远行 285
上一篇: 华为2021届机试题二叉树路径最大和
下一篇: 三数之和
PMPWDF
博客等级 码龄10年 44粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值