news 2026/10/5 2:31:51

元宝 专家 LeetCode 152. 乘积最大子数组 C++实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
元宝 专家 LeetCode 152. 乘积最大子数组 C++实现

下面是 LeetCode 152. 乘积最大子数组 的 C++ 实现。思路与 Python / Rust 完全一致,我为你提供 LeetCode 标准写法 和 完整可运行示例,并额外补充一个防溢出安全版。

✅ 核心思路(简要回顾)

乘积与求和不同,遇到负数会翻转符号,遇到 0 会清零,因此:

  • 必须同时维护
    “imax”(以当前元素结尾的最大乘积)和
    “imin”(最小乘积)
  • 遇到负数时,交换
    “imax” 和
    “imin”
  • 每一步允许从当前元素“重新开始”(
    “max(x, imax * x)”)
  • 用
    “ans” 记录全局最大值

✅ 解法一:LeetCode 标准写法(推荐)

对应 LeetCode 函数签名,使用
“int”,代码简洁直观。
#include
#include
using namespace std;

class Solution {
public:
int maxProduct(vector& nums) {
if (nums.empty()) return 0;

int imax = nums[0]; int imin = nums[0]; int ans = nums[0]; for (int i = 1; i < nums.size(); ++i) { int x = nums[i]; // 遇到负数,最大最小会反转,先交换 if (x < 0) { swap(imax, imin); } // 更新以当前位置结尾的最大/最小乘积 imax = max(x, imax * x); imin = min(x, imin * x); // 更新全局答案 ans = max(ans, imax); } return ans; }

};

✅ 解法二:防溢出安全版(使用
“long long”)

虽然题目保证最终结果在
“int” 范围内,但中间乘法可能溢出
“int”(如
“2147483647 * 2”)。用
“long long” 存中间变量更安全。
#include
#include
using namespace std;

class Solution {
public:
int maxProduct(vector& nums) {
if (nums.empty()) return 0;

long long imax = nums[0]; long long imin = nums[0]; long long ans = nums[0]; for (int i = 1; i < nums.size(); ++i) { int x = nums[i]; if (x < 0) { swap(imax, imin); } imax = max((long long)x, imax * x); imin = min((long long)x, imin * x); ans = max(ans, imax); } return (int)ans; }

};

✅ 完整可运行测试代码

#include
#include
#include
using namespace std;

class Solution {
public:
int maxProduct(vector& nums) {
if (nums.empty()) return 0;

int imax = nums[0]; int imin = nums[0]; int ans = nums[0]; for (int i = 1; i < nums.size(); ++i) { int x = nums[i]; if (x < 0) { swap(imax, imin); } imax = max(x, imax * x); imin = min(x, imin * x); ans = max(ans, imax); } return ans; }

};

int main() {
Solution sol;
vector<vector> testCases = {
{2, 3, -2, 4},
{-2, 0, -1},
{-2, 3, -4},
{-1},
{0, 2, 0, 3, 4},
{-4, -3, -2}
};

for (auto& nums : testCases) { int result = sol.maxProduct(nums); cout << "输入: ["; for (size_t i = 0; i < nums.size(); ++i) { cout << nums[i]; if (i != nums.size() - 1) cout << ", "; } cout << "] -> 输出: " << result << endl; } return 0;

}

输出结果:

输入: [2, 3, -2, 4] -> 输出: 6
输入: [-2, 0, -1] -> 输出: 0
输入: [-2, 3, -4] -> 输出: 24
输入: [-1] -> 输出: -1
输入: [0, 2, 0, 3, 4] -> 输出: 12
输入: [-4, -3, -2] -> 输出: 12

📊 复杂度分析

指标 数值
时间复杂度 O(n) — 单次遍历
空间复杂度 O(1) — 仅用常数变量

🔧 C++ 实现要点

要点 说明

“std::swap” 交换两个同类型变量,头文件
“” 或直接使用(C++11 起在
“” 中,但通常
“” 已包含)

“std::max” /
“std::min” 需要
“” 头文件
整数溢出
“int” 相乘可能溢出,若面试或工程环境严谨,建议用
“long long” 存
“imax” /
“imin”
空数组判断 LeetCode 保证
“nums.length >= 1”,但防御性编程可加上
“empty()” 判断

💡 一句话总结

乘积最大子数组 = 维护最大/最小乘积 + 遇负交换 + 允许重启 + O(1) 空间
需要我补充分治/线段树解法,或者帮你对比 C++ / Rust / Python 三种实现的性能差异吗?😊

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 2:31:14

外贸网站谷歌SEO怎么收费?报价主要看哪些因素?

外贸网站谷歌SEO费用&#xff0c;可以先按“检查与规划、内容、技术实施、发布复验、持续协作”拆开看。网站基础、市场语言、内容资料和系统复杂度影响工作量&#xff0c;双方分工决定哪些工作进入服务费。 对已有开发团队的企业而言&#xff0c;最容易漏问的不是总价&#x…

作者头像 李华
网站建设 2026/10/5 2:31:09

机器学习数学基础──第 5 章 导数:变化的速度

第 5 章 导数:变化的速度 5.1 从一个问题开始:这一刻有多快 先说说我当年卡了半年的一个点,也许你也会卡在同一处:定义式里明明写着 h→0h \to 0h→0,但一动手就忍不住把 h=0h = 0

作者头像 李华
网站建设 2026/10/5 2:30:00

装饰器decorator总结(函数即是变量、高阶函数、嵌套函数、参数组)

装饰器 decorator的本质他就是函数原则&#xff1a;–对于被装饰的函数他不发生任何变化&#xff0c;他是透明的。 不能修改被装饰的函数的源代码不能修改被装饰的函数的调用方式 函数就是”变量“&#xff1a; 普通变量。先定义后使用&#xff1a;如x1&#xff0c;先定义变量x…

作者头像 李华
网站建设 2026/10/5 2:29:51

第068篇 sealed class:状态建模的利器

sealed class 在 Kotlin 里的地位,相当于"用类型系统表达状态机"。它的价值不在语法,而在一个很实际的痛点:当一个值有多种可能形态时,怎么保证"处理了这几种形态"这件事不会漏。 面试里问 sealed class,问的往往不是"是什么",而是"你…

作者头像 李华