Leetcode #152 Maximum Product Subarray

本文探讨了LeetCode上的一道经典问题——最大子数组乘积。通过对问题的深入解析,提出了一种较为复杂的解决方案,并进一步介绍了官方推荐的动态规划方法。该方法通过同时跟踪最大和最小子数组乘积来解决问题,适用于包含正负数的数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://leetcode.com/problems/maximum-product-subarray/

 

较麻烦的解法:

  • 先判断数组中有没有0,有的话可以转换为求"0之前"和"0之后"两部分的较大值。

  • 遍历,记录数组中负数的个数:  

    • 偶数:由于数组中都是整数,最大值即这些值的乘积。

    • 奇数:有以下几种可能,取它们中的最大值。

      • 第一个负数 / 最后一个负数。

      • 第一个负数之前的乘积 / 最后一个负数之前的乘积。

      • 第一个负数之后的乘积 / 最后一个负数之后的乘积。

 

官方的Solution :

Besides keeping track of the largest product, we also need to keep track of the smallest product. Why? The smallest product, which is the largest in the negative sense could become the maximum when being multiplied by a negative number.

Let us denote that:

f(k) = Largest product subarray, from index 0 up to k.

Similarly,

g(k) = Smallest product subarray, from index 0 up to k.

Then,

f(k) = max( f(k-1) * A[k], A[k], g(k-1) * A[k] )
g(k) = min( g(k-1) * A[k], A[k], f(k-1) * A[k] )

There we have a dynamic programming formula. Using two arrays of size n, we could deduce the final answer as f(n-1). Since we only need to access its previous elements at each step, two variables are sufficient.

转载于:https://www.cnblogs.com/meowcherry/p/4394888.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值