刷题记录 贪心算法-4:53. 最大子数组和

devtools/2025/2/3 18:31:25/

题目:53. 最大子数组和

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

一、模式识别

1.算法>贪心算法

局部最优解:连续和为负时放弃连续和,重新开始连续和

局部到全局:选取多个子数组的最大连续和

反例:(象征性的写一下,能用贪心的都不会有,而且也不用证明)

代码随想录里也说这道题的贪心并不好想

不仅不好想,而且仔细想会发现连续和为负时放弃连续和只是一个必要条件,

2.动态规划

序列问题:经典动态规划问题,所以其实本题更容易想到动态规划解法

(1)定义:dp[i]: 以nums[i]为结尾的最大数字和

(2)递推公式:dp[i] = max(dp[i - 1] +num, num)

dp[i - 1]是以前一个数字为结尾的最大值

由于连续数组条件限制,因此在本轮中只能在加入以前的连续序列重新开始之间做出选择

(3)初始化:由递推,任意dp[i]依赖于dp[i - 1],需要从dp[0]开始

(4)遍历顺序:由递推,dp[i]依赖于dp[i - 1],需要从前往后

二、代码实现

1.暴力解法

连续子序列这么明确的条件,用两层嵌套循环分别表示起始点和终止点最容易实现了

python">class Solution:def maxSubArray(self, nums: List[int]) -> int:n = len(nums)ans = -inffor i, num in enumerate(nums):for j in range(i, n):sum_all = sum(nums[i: j + 1])if sum_all > ans:ans = sum_allreturn ans

但有个缺点:会超时 

2.算法>贪心算法

python">class Solution:def maxSubArray(self, nums: List[int]) -> int:n = len(nums)ans = -infcount = 0for i, num in enumerate(nums):count += numif count < num:count = numif count > ans:ans = countreturn ans

3.动态规划

python">class Solution:def maxSubArray(self, nums: List[int]) -> int:n = len(nums)dp = [-inf] * nans = dp[0] = nums[0]for i in range(1, n):dp[i] = max(dp[i - 1] + nums[i], nums[i])if dp[i] > ans:ans = dp[i]return ans

三、动态规划与算法>贪心算法的逻辑关系

仔细观察动态规划的递推公式dp[i] = max(dp[i - 1] +num, num)

dp[i - 1] +num和num的选择条件是是什么?

很明显是dp[i - 1]的值的正负号,与算法>贪心算法连续和为负时放弃连续和的条件完全吻合

因此,本题的关键就在于理解“连续”:

由于只能对连续子数组求和,

对于每一个数字,只需要在与上一个数字的连续和相加重新开始算连续和之间做出选择

不需要考虑当前数字与哪些数字求和能得到最大值

所以实际上对于本题而言:

动态规划解法就是算法>贪心算法的充分性证明,

算法>贪心算法就是动态规划的精简版

以下是算法>贪心算法到动态规划的一个过渡态写法:

python">class Solution:def maxSubArray(self, nums: List[int]) -> int:n = len(nums)ans = -infcount = 0for i, num in enumerate(nums):count += numif count < num:count = numif count > ans:ans = countreturn ans

注意相比与算法>贪心算法count的比较顺序是调换的


http://www.ppmy.cn/devtools/155796.html

相关文章

springCload快速入门

原作者&#xff1a;3. SpringCloud - 快速通关 前置知识&#xff1a; Java17及以上、MavenSpringBoot、SpringMVC、MyBatisLinux、Docker 1. 分布式基础 1.1. 微服务 微服务架构风格&#xff0c;就像是把一个单独的应用程序开发为一套小服务&#xff0c;每个小服务运行在自…

03-画P封装(制作2D+添加3D)

画P封装的方法2D制作3D添加 使用P封装自己画0603格式的电阻的P封装1. 看规格书,找参数2. 创建一个新的P封装3. 灯泡两侧放焊盘4.设置焊盘大小和形状5.根据坐标定义中间间隔: L/2原则6. 画最外层丝印(丝印层直接围住即可)7.在平面的P封装上,添加3D立体封装库 立创商城下载P封装向…

开源2+1链动模式AI智能名片S2B2C商城小程序:利用用户争强好胜心理促进分享行为的策略研究

摘要&#xff1a;随着互联网技术的快速发展和社交媒体的普及&#xff0c;用户分享行为在企业营销中的作用日益凸显。本文旨在探讨如何利用用户的争强好胜心理&#xff0c;通过开源21链动模式AI智能名片S2B2C商城小程序&#xff08;以下简称“小程序”&#xff09;促进用户分享行…

oracle 19C RAC打补丁到19.26

oracle 19CRAC打补丁到19.26 本文只保留简介命令和每个命令大概的用时&#xff0c;方便大家直接copy使用&#xff0c;并了解每个命令的预期时间&#xff0c;减少命令执行期的等待焦虑。 1.本次所需的补丁如下 p6880880_190000_Linux-x86-64.zip &#xff08;.43的opatch&…

LabVIEW 保存文件 生产者/消费者设计

LabVIEW 保存文件 生产者/消费者设计 简介生产消费模式设计结构 简介 主从模式的数据通信是利用全局变量、局域变量或共享变量实现的&#xff0c;由于这些变量的每次复制都是原始数据的一个副本&#xff0c;占据了大量的空间。实际上&#xff0c;只需要使用一部分缓冲区作为数…

Windows11 不依赖docker搭建 deepseek-R1 1.5B版本(附 Open WebUi搭建方式)

零、前言 过年这几天发现 DeepSeek 非常火&#xff0c;试用了一下发现确实不错。与豆包、kimi、perplexity 这些相比完全不是一个次元的存在&#xff0c;特别是用ta写文章的时候体验非常好。所以试着自己搭一个环境。 一、安装 Ollama和DeepSeek-R1 我的安装方式很简单&#xf…

【Block总结】高效多尺度注意力EMA,超越SE、CBAM、SA、CA等注意力|即插即用

论文信息 标题: Efficient Multi-Scale Attention Module with Cross-Spatial Learning 作者: Daliang Ouyang, Su He, Guozhong Zhang, Mingzhu Luo, Huaiyong Guo, Jian Zhan, Zhijie Huang 论文链接: https://arxiv.org/pdf/2305.13563v2 GitHub链接: https://github.co…

02 使用 海康SDK 对人脸识别设备读取事件

前言 最近朋友的需求, 是需要使用 海康sdk 连接海康设备, 进行数据的获取, 比如 进出车辆, 进出人员 这一部分是 对接海康人脸设备 获取相关事件, 并进行入库 的相关处理 测试用例 主要的处理如下 1. 设备登陆, 不同的设备可能兼容的 登陆方式不一样, 我这里设备需要使用…