动态规划之连续乘积最大子数组 连续和最大子数组

news2024/11/17 16:43:38

一. 连续和最大子数组

给你一个整数数组 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.1 怎么想到使用动态规划?

当然是题目给的建议。

  1. 题目中讲,求最大和。
  2. 题目中讲,返回最大和。

我们要做的是求一个目标值(通常最大,最小), 不要求过程,只要结果。 对于这种题目,我们通常使用动态规划

1.2 动态规划第一步该做什么?

首先明确几个关键点。

  1. 最大连续子数组,与子序列区别开,即数组下标连续。
  2. 和最大,针对每个【i】怎么计算子问题。

当然就是找到状态转移方程啊!

f ( i ) = { f ( i − 1 ) + i ( i < = f ( i − 1 ) + i ) i ( i > f ( i − 1 ) + i ) f(i) =\left\{ \begin{aligned} f(i-1) + i (i <= f(i-1) + i) \\ i (i > f(i-1) + i) \end{aligned} \right. f(i)={f(i1)+i(i<=f(i1)+i)i(i>f(i1)+i)

求和的状态转移方程很简单。当我们有了 i - 1位置的结果,去求 i位置的连续子数组和,当然就是用 f ( i − 1 ) + i 和 i f(i-1) + i 和 i f(i1)+ii 比较一下,拿最大的呀

仔细想想,这不对吧?
在这里插入图片描述
这有什么不对的呢?

在这里插入图片描述
明显,前4个最大连续和是 1 + 2 + 3 = 6。

所以错在哪里了呢?或者说,我们怎么计算能得到6呢?

很简单,return 2 > 6 ? 2 : 6 不就行了吗

我们的函数计算的值是以当前坐标为结尾的数组的最大子数组。
动态规划的子问题和整体问题求的目标是一致的,只有状态再更迭,此处的状态就是下标index。

计算得到函数要与旧的最大值进行比较取最大。

fun maxSubArray(nums []int) int {
	pre, res := 0, nums[0]
	for _, v := range nums {
		pre = max(pre + v, v)
		res = max(res, pre)
	}
	return res
}

二. 连续乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。

示例 1:

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:

输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

2.1 这个题目使用什么方法?

  1. 乘积最大。
  2. 返回乘积。
  3. 连续子数组。

这俩题目,是不是一样的。先想一想差别。

求最大值,返回结果, 那使用动态规划没什么问题。

2.2 直接写代码

fun maxSubArray(nums []int) int {
	pre, res := 1, nums[0]
	for _, v := range nums {
		pre = max(pre * v, v)
		res = max(res, pre)
	}
	return res
}

因为乘法,所以pre初始值改为1 。

会有问题吗?

在这里插入图片描述
明显的错误…

只是加法变乘法,原来的方案就行不通了。

问题就在于,乘法遇到负数,从最大变成了最小,-4 * 3 = -12

所以我们需要对这个负号进行一下特殊的处理。

2.3 状态该怎么变化呢?

如果遇到负数,我们希望使用一个最小的值与其做乘积运算,期望得到一个最大的值; 反之遇到正数,我们要用一个最大的值进行乘积运算。

所以,我们需要记两个值,分别是一个最大的preMax 和一个最小的preMin.

p r e M a x = f ( i ) m a x p r e M i n = f ( i ) m i n p r e M a x = M a x ( f ( i − 1 ) m a x ∗ n u m [ i ] , f ( i − 1 ) m i n ∗ n u m [ i ] , n u m [ I ] ) p r e M i n = M i n ( f ( i − 1 ) m i n ∗ n u m [ i ] , f ( i − 1 ) m a x ∗ n u m [ i ] , n u m [ I ] ) preMax = f(i)_{max} \\ preMin = f(i)_{min}\\ preMax = Max(f(i-1)_{max}*num[i], f(i-1)_{min} * num[i], num[I])\\ preMin= Min(f(i-1)_{min}*num[i], f(i-1)_{max} * num[i], num[I]) preMax=f(i)maxpreMin=f(i)minpreMax=Max(f(i1)maxnum[i],f(i1)minnum[i],num[I])preMin=Min(f(i1)minnum[i],f(i1)maxnum[i],num[I])

代码就比较简单了

func maxProduct(nums []int) int {
    preMax,preMin, res := 1,1, nums[0]
    for _,v := range nums {
    	mn,mx := preMin,preMax
    	preMax = max(mx * v, max(mn * v,v))
    	preMin = min(mn * v, min(mx * v,v))
    	res = max(preMax,res)
    }
    return res

为什么多了一行mn,mx := preMin,preMax
你可以去掉试试看~

20230902记录,今天先到这里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/962988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

23062day6

作业&#xff1a;将dict.txt导入到数据库中。 方法1&#xff1a;创建shell脚本&#xff0c; 调用指令创建数据库和表格&#xff0c;使用循环在循环中用数组存储dict.txt的内容并插入表格中。 方法2&#xff1a;在终端创建数据库和表格&#xff0c;将dict.txt中的内容手动输入…

OB Cloud 初体验⎮用户之声

OceanBase 作为国内一款优秀的分布式数据库&#xff0c;这些年来发展很快&#xff0c;在金融、电商、政企、物流等行业得到广泛应用。之前多为私有化部署&#xff0c;去年也推出云版本并于最近进行重大升级。受朋友之约&#xff0c;对其云产品做了个简单测试。因时间所限&#…

Django(10)-项目实战-对发布会管理系统进行测试并获取测试覆盖率

在发布会签到系统中使用django开发了发布会签到系统&#xff0c; 本文对该系统进行测试。 django.test django.test是Django框架中的一个模块&#xff0c;提供了用于编写和运行测试的工具和类。 django.test模块包含了一些用于测试的类和函数&#xff0c;如&#xff1a; Tes…

【算法奥义】最大矩形问题

首先建立一个二维数组&#xff0c;这个二维数组&#xff0c;计算出矩阵的每个元素的左边连续 1 的数量&#xff0c;使用二维数组 left记录&#xff0c;其中left[i][j] 为矩阵第 i 行第 j 列元素的左边连续 1 的数量。 也就是从这个元素开始&#xff0c;从右往左边数有多少个连…

一年一度的苹果秋季发布会7个重要议题需回答,看是否有你关心的

当苹果公司举行产品发布会,比如即将于9月12日举行的苹果活动时,这无疑是该公司向我们介绍其最终展示的产品的来龙去脉的机会。但这也是苹果回答一些紧迫问题的机会,不仅是关于其最新的iPhone、Apple Watch和平板电脑,还有关于其作为一家公司的发展方向。 我们将在9月12日的…

iMazing2024绿色版iOS手机备份软件

乍一看&#xff0c;编辑iPhone或iPad的备份似乎是一个奇怪的命题&#xff0c;但实际上这样做的原因有很多&#xff0c;例如在备份数据损坏时进行修复&#xff0c;又如合并来自不同设备的数据。 iMazing对备份文件编辑的支持非常全面&#xff0c;即使备份是加密的、或是横跨不同…

SVN基本使用笔记——广州云科

简介 SVN是什么? 代码版本管理工具 它能记住你每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复己经删除的文件 SVN跟Git比&#xff0c;有什么优势 使用简单&#xff0c;上手快 目录级权限控制&#xff0c;企业安全必备 子目录Checkout&#xff0c;减少不必要的文件检出…

【UIPickerView案例02-点餐显示数据默认选中 Objective-C语言】

一、这个显示数据 1.它里面,有数据源协议、代理协议、以前,TableView里面,怎么用的, 前面我们是怎么做的, 1)第一步:你是不是设置数据, 设置数据源对象、代理对象、然后呢, 然后呢,咱们Main.storyboard,是不是右键, 把这个数据源对象,拖到控制器上 代理对象,…

Mybatis 动态SQL – 使用if,where标签动态生成条件语句

前面几篇我们介绍了使用Mybatis进行数据的增删改查&#xff0c;并且也了解了如何在Mybatis中使用JDK的日志系统打印日志&#xff1b;本篇我们继续介绍如何使用Mybatis提供的if,where标签动态生成条件语句。 如果您对数据的增删改查和Mybatis集成JDK日志系统不太了解&#xff0…

Mysql锁及行锁机制探索

先讲一下mysql存储方式(innodb) 分为&#xff0c;聚簇索引和非聚簇索引。 聚簇索引&#xff0c;就是b树的所有真实数据。 聚簇索引不是一种索引类型&#xff0c;而是一种数据存储方式。innoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时&…

PlumeLog查不到日志

一 问题&#xff1a; PlumeLog查不到日志&#xff0c;记录遇到的情况 二 场景 1. 输入不全

5款轻量级小软件,突出一个简洁轻便

​ 今天的主题是简洁&#xff0c;轻便&#xff0c;都是轻量级的小软件&#xff0c;界面都是非常简洁&#xff0c;而且无广告的。 1.图形设计——Affinity Designer ​ Affinity Designer是一款获奖的矢量图形软件&#xff0c;它设定了设计界的新标准。它适用于Windows, macOS…

FANUC机器人电气控制柜内部硬件电路和模块详细介绍

FANUC机器人电气控制柜内部硬件电路和模块详细介绍 PSU电源单元 通过背板传输了如下电源 +5 +2.0V +3.3 +24v +24E +15V -15V 主板--接口描述: 主板内部结构: 面板电路板: 引申一下 KM21 与 KM22 的作用它们分别接至操作面板上上的急停按

c++入门一

参考&#xff1a;https://www.learncpp.com/cpp-tutorial/ When you finish, you will not only know how to program in C, you will know how NOT to program in C, which is arguably as important. Tired or unhappy programmers make mistakes, and debugging code tends…

详解mysql事务,事务并发安全问题的复现以及大事务的优化

好文推荐&#xff1a; 2.5万字详解23种设计模式 springboot 实现延时队列&#xff08;超级实用&#xff09; 2.5万字讲解DDD领域驱动设计 文章目录 1. 事务定义2. 事务特性&#xff08;ACID&#xff09;3. 事务并发问题4. 事务隔离级别5. 基础命令6. 脏读复现7. 不可重复读复现…

滑动窗口实例5(水果成篮)

题目&#xff1a; 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须按…

qt相关的demo集合

自己写过的qt/c相关程序的demo集合 &#xff08;许多学习自网络中&#xff0c;很感谢大家的分享&#xff09; 源码地址&#xff1a;Qt与学习通页面: 记录与Qt相关的代码 - Gitee.com 源码目录: echart简单应用 opencv图像处理 QSetting简单使用 QtAv播放视频 ui页面 表情 超星…

Vue框架--Vue中的数据代理

下面,我们一起来说以下Vue中的数据代理。 1.Object.defineProperty()方法回顾 * Object.defineProperty()方法基本配置项 * value:指定设置对象内容的属性值 * enumerable:true, //控制属性是否可以枚举(也就是是否可以被遍历),默认值是false * writable:true, //控制属性是…

苹果将在iPhone16系列中引入微透镜阵列技术,亮度更高、功耗更低

根据韩国媒体The Elec的报道&#xff0c;苹果公司正与其主要供应商三星和LG展开合作&#xff0c;以评估并衡量是否有必要在明年的iPhone 16系列中引入微透镜&#xff08;micro-lens&#xff09;技术来升级屏幕。 这项方案集中在OLED屏幕架构上&#xff0c;计划采用微透镜阵列&…

20用于深度学习训练和研究的数据集

数据集在计算机科学和数据科学中发挥着至关重要的作用。它们用于训练和评估机器学习模型&#xff0c;研究和开发新算法&#xff0c;改进数据质量&#xff0c;解决实际问题&#xff0c;推动科学研究&#xff0c;支持数据可视化&#xff0c;以及决策制定。数据集提供了丰富的信息…