LeetCode152 maximum-product-subarray(乘积最大子数组)
题目
Given an integer array nums, find a contiguous non-empty subarray within the array that has the largest product, and return the product.
It is guaranteed that the answer will fit in a 32-bit integer.
A subarray is a contiguous subsequence of the array.
Example 1:
Input: nums = [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
Example 2:
Input: nums = [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
Constraints:
1 <= nums.length <= 2 * 10⁴
-10 <= nums[i] <= 10
The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.
方法
动态规划法
由于数组的数字有正有负,我们讲乘积分为正数和负数讨论,max数组保存正数的情况,min数组保存负数的情况,例如:
- 当乘积m为正,当前数num[i]为正,此时max数组保存m*nums[i]为最大值
- 当乘积m为正,当前数num[i]为负,此时max数组保存num[i]作为最大值,min数组保存m*nums[i]为最小值
- 当乘积m为负,当前数num[i]为正,此时max数组保存num[i]作为最大值,min数组保存m*nums[i]为最小值
- 当乘积m为负,当前数num[i]为负,此时max数组保存m*num[i]作为最大值
以上情况包括正数和负数最大值的所有情况 - 时间复杂度:O(n)
- 空间复杂度:O(n)
class Solution {
public int maxProduct(int[] nums) {
int length = nums.length;
if(length<=0){
return 0;
}
int[] max_dp = new int[length];
int[] min_dp = new int[length];
int max = nums[0];
max_dp[0] = nums[0];
min_dp[0] = nums[0];
for(int i=1;i<length;i++){
max_dp[i] = Math.max(max_dp[i-1]*nums[i],Math.max(min_dp[i-1]*nums[i],nums[i]));
min_dp[i] = Math.min(max_dp[i-1]*nums[i],Math.min(min_dp[i-1]*nums[i],nums[i]));
max = Math.max(max,max_dp[i]);
}
return max;
}
}
动态规划法-空间优化
- 时间复杂度:O(n)
- 空间复杂度:O(1)
class Solution {
public int maxProduct(int[] nums) {
int length = nums.length;
if(length<=0){
return 0;
}
int max = nums[0],max_dp= nums[0],min_dp = nums[0];
for(int i=1;i<length;i++){
int mx = max_dp,mn = min_dp;
max_dp = Math.max(mx*nums[i],Math.max(mn*nums[i],nums[i]));
min_dp = Math.min(mx*nums[i],Math.min(mn*nums[i],nums[i]));
max = Math.max(max,max_dp);
}
return max;
}
}
分类:
LeetCode Hot100
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理