资讯动态

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

发布时间:2026/10/5 2:32:00 来源:尧图企业网站定制
下面是 LeetCode 152. 乘积最大子数组 的 C 实现。思路与 Python / Rust 完全一致我为你提供 LeetCode 标准写法 和 完整可运行示例并额外补充一个防溢出安全版。✅ 核心思路简要回顾乘积与求和不同遇到负数会翻转符号遇到 0 会清零因此必须同时维护“imax”以当前元素结尾的最大乘积和“imin”最小乘积遇到负数时交换“imax” 和“imin”每一步允许从当前元素“重新开始”“max(x, imax * x)”用“ans” 记录全局最大值✅ 解法一LeetCode 标准写法推荐对应 LeetCode 函数签名使用“int”代码简洁直观。#include#includeusing 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#includeusing 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#includeusing 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;vectorvector 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” 交换两个同类型变量头文件“” 或直接使用C11 起在“” 中但通常“” 已包含“std::max” /“std::min” 需要“” 头文件整数溢出“int” 相乘可能溢出若面试或工程环境严谨建议用“long long” 存“imax” /“imin”空数组判断 LeetCode 保证“nums.length 1”但防御性编程可加上“empty()” 判断 一句话总结乘积最大子数组 维护最大/最小乘积 遇负交换 允许重启 O(1) 空间需要我补充分治/线段树解法或者帮你对比 C / Rust / Python 三种实现的性能差异吗

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑