当前位置: 首页 > news >正文

《LeetCode 152 乘积最大子数组 || LeetCode 413 等差数列划分》

一、题目

二、做题思路

2.1 状态表示(核心基础)

本题要求计算数组中乘积最大的连续子数组。由于负数相乘可能反转大小关系,仅记录最大乘积不够,还需记录最小乘积。因此定义两个状态:

  • f[i]表示以nums[i]结尾的子数组的最大乘积

  • g[i]表示以nums[i]结尾的子数组的最小乘积

2.2 状态转移方程(关键难点)

对于以nums[i]结尾的子数组,有三种可能来源:

  1. 单独成为子数组:即nums[i]自身。

  2. 延续前一个最大乘积f[i-1] * nums[i]

  3. 延续前一个最小乘积g[i-1] * nums[i](当nums[i]为负数时,乘以最小可能得最大)。
    因此,当前最大和最小乘积分别为三者中的最大值和最小值:
    f[i] = max(nums[i], f[i-1]*nums[i], g[i-1]*nums[i])
    g[i] = min(nums[i], f[i-1]*nums[i], g[i-1]*nums[i])

2.3 初始化(边界防护)

第一个元素(下标 0)没有前驱,因此f[0] = g[0] = nums[0],同时全局最大乘积ret初始化为nums[0]

2.4 填表顺序(递推方向)

每个i状态仅依赖i-1的状态,因此必须从左到右(即i从 1 到n-1)依次填充两个数组,确保每个状态计算时,其所有前置状态均已就绪

2.5 返回值(目标映射)

题目要求返回整个数组中乘积最大的连续子数组的乘积,即所有f[i]中的最大值。我们在递推过程中同步维护ret,最终返回ret

三、代码

class Solution { public: int maxProduct(vector<int>& nums) { int n = nums.size(); // 边界处理:若数组为空,返回0(题目一般保证非空,但为健壮性加上) if (n == 0) return 0; // 1. 创建dp表 // f[i] : 以 nums[i] 结尾的子数组的最大乘积 // g[i] : 以 nums[i] 结尾的子数组的最小乘积 // 维护最小乘积是因为负数乘以负数可能变成正数,从而成为最大乘积 vector<int> f(n); vector<int> g(n); // 2. 初始化:第一个元素结尾的最大和最小乘积都是 nums[0] f[0] = g[0] = nums[0]; int ret = nums[0]; // 全局最大乘积 // 3. 填表顺序:从左到右(i 从 1 到 n-1),因为 f[i] 依赖 f[i-1] 和 g[i-1] for (int i = 1; i < n; i++) { int x = nums[i]; // 单独成为子数组 int y = f[i - 1] * nums[i]; // 乘以前一个最大乘积 int z = g[i - 1] * nums[i]; // 乘以前一个最小乘积 // 4. 状态转移方程: // 当前最大乘积 = max(单独, 最大乘当前, 最小乘当前) f[i] = max(x, max(y, z)); // 当前最小乘积 = min(单独, 最大乘当前, 最小乘当前) g[i] = min(x, min(y, z)); // 更新全局最大乘积 ret = max(ret, f[i]); } // 5. 返回值:全局最大乘积 return ret; } };

四、流程图

五、题目

六、做题思路

6.1 状态表示(核心基础)

本题要求计算数组中所有等差数列子数组的个数。由于等差数列子数组必须是连续的,且长度至少为 3,我们定义dp[i]表示以nums[i]结尾的等差数列子数组的个数

6.2 状态转移方程(关键难点)

要判断以nums[i]结尾能否形成新的等差数列,只需检查最后三个元素nums[i-2]nums[i-1]nums[i]是否构成等差,即nums[i] - nums[i-1] == nums[i-1] - nums[i-2]

  • 若满足,则以nums[i]结尾的等差数列数 = 以nums[i-1]结尾的等差数列数 + 1(新增一个长度为 3 的子数组[nums[i-2], nums[i-1], nums[i]],同时之前的所有等差数列向后延伸一位也形成新的更长的数列)。

  • 若不满足,则无法形成新的等差数列,dp[i] = 0
    因此方程:dp[i] = (nums[i] - nums[i-1] == nums[i-1] - nums[i-2]) ? dp[i-1] + 1 : 0

6.3 初始化(边界防护)

长度小于 3 的数组不可能构成等差数列,因此若n < 3,直接返回 0。对于dp[0]dp[1],它们无法作为长度≥3 的结尾,默认初始化为 0

6.4 填表顺序(递推方向)

dp[i]仅依赖dp[i-1]和前两个元素,因此必须从左到右(即i从 2 到n-1)依次填充dp表,确保每个状态计算时,其前置状态已就绪

6.5 返回值(目标映射)

题目要求返回所有等差数列子数组的总个数。每个子数组都有唯一的结尾位置,因此总数为所有dp[i]的累加和:total = sum(dp[i])i从 2 到n-1)。我们在递推过程中累加dp[i],最终返回total

七、代码

class Solution { public: int numberOfArithmeticSlices(vector<int>& nums) { int n = nums.size(); // 若数组长度小于3,不可能存在等差数列,直接返回0(题目保证n>=1,但为健壮性加上) if (n < 3) return 0; // 1. 创建dp表 // dp[i] 表示以 nums[i] 结尾的等差数列(长度≥3)的个数 // 例如 nums = [1,2,3,4],dp[2]=1([1,2,3]),dp[3]=2([2,3,4]和[1,2,3,4]) vector<int> dp(n, 0); int total = 0; // 累计所有等差数列总数 // 2. 初始化:dp[0]和dp[1]默认为0,无需显式赋值 // 3. 填表顺序:从左到右(i从2到n-1),因为dp[i]依赖dp[i-1]和前两个元素 for (int i = 2; i < n; i++) { // 4. 状态转移方程: // 若当前三个连续元素构成等差数列(nums[i]-nums[i-1] == nums[i-1]-nums[i-2]), // 则以i结尾的等差数列个数 = 以i-1结尾的个数 + 1(新增的以[i-2,i-1,i]为结尾的长度为3的数列) // 否则,无法形成新的等差数列,dp[i] = 0 dp[i] = (nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]) ? dp[i - 1] + 1 : 0; // 累加所有dp[i]即为总个数(因为每个等差数列都有唯一结尾位置) total += dp[i]; } // 5. 返回值:累计的等差数列总数 return total; } };

八、流程图

http://www.jsqmd.com/news/1168095/

相关文章:

  • AlphaFold 3依赖冲突深度解析:5步精准排查与解决方案
  • 二手钻石回收价格查询|2026 易奢福大连甘井子区线上线下同步估价 - 奢侈品回收实体店
  • IPD集成产品开发,产品设计怎样找核心用户?
  • 3000+戴森球计划工厂蓝图库:从新手到专家的星际工厂建造指南 [特殊字符]
  • 论文提交前48小时,GPT能写但文献和排版谁来兜底?这次测给你看
  • 终极文件管理革命:如何用FileMeta让Windows文件搜索效率提升300%
  • 免疫调理消费需求持续攀升 牛初乳科学选购成公众关注焦点
  • 2026新发布,沧州企业如何挑选靠谱网络推广服务商|行业避坑测评指南 - 资讯报道
  • 2026毓典奢品汇|天津黄金回收正规门店TOP5排名|国标黄金折价规则+市监局维权判例+黄金回收专属白皮书全解析 - 奢侈品测评参考
  • Fuzz 测试完整指南(模糊测试实战手册)
  • STM32与TPD2015FN构建工业级多路负载驱动方案
  • Legacy Update:如何让老旧Windows系统重新获得安全更新支持?
  • 石景山区职务犯罪律所:老工业区改造中职务犯罪辩护策略 - 品牌深度评测
  • 工业信号隔离与抗干扰:FOD4216光耦与STM32应用
  • 3分钟快速上手:Etcher镜像烧录工具全平台安装与使用指南
  • 终极指南:如何用Moonlight-Switch让你的任天堂Switch变身便携游戏主机
  • AI 辅助 Code Review 检查清单:把规范沉淀为可自动校验的规则
  • cann/runtime主机内存管理
  • 城通网盘下载太慢?这个免费开源工具让你的速度提升10倍
  • FanControl:Windows平台开源风扇控制软件完全指南
  • 如何用digiCamControl实现专业级相机遥控:从新手到高手的完整指南
  • Neo4j AuraDB 与 Docker 社区版部署对比:3 大场景下的成本与性能实测
  • 买韩国商标别踩坑!2026 正规韩国商标购买网站深度测评,一文看懂怎么选 - GrowUME
  • 苏州性价比高的美食去哪家?景区核心地段高价值餐饮解析 - 新闻快传
  • Citra 3DS模拟器终极指南:如何在PC上完美运行任天堂3DS游戏
  • 2026年PMP超全指南:考试安排+改版解读+避坑攻略,一篇足够
  • 2026筑宅安|南京阳光房漏水专业修缮,家装商用玻璃顶渗漏、屋面工程一站式根治渗水难题 - 筑宅安
  • 鹤壁办婚宴,烟酒怎么备不浪费又体面?
  • 《2026 家庭住宅防水维修服务白皮书正式发布》 - 徽顺虹
  • UE5.4引擎升级导致UE4SS签名失效?手把手教你定位并修复FText构造函数签名