题目描述:
给定一个整数数组 nums
,找出一个连续子数组(至少包含一个数字),使得该子数组的乘积最大。
示例:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 的乘积最大为 6。
解题思路:
这道题可以使用动态规划来解决。由于数组中可能包含负数,我们需要维护两个变量:max_product
和 min_product
,分别表示当前的最大乘积和最小乘积。因为负数乘以负数会变成正数,所以当前的最小乘积可能会成为未来的最大乘积。
具体步骤:
- 初始化
max_product
和min_product
为数组的第一个元素。 - 遍历数组,对于每个元素
num
:- 如果
num
是负数,交换max_product
和min_product
。 - 更新
max_product
为max(num, max_product * num)
。 - 更新
min_product
为min(num, min_product * num)
。 - 更新全局最大乘积
result
为max(result, max_product)
。
- 如果
- 返回
result
。
代码实现:
def maxProduct(nums):
if not nums:
return 0
max_product = min_product = result = nums[0]
for num in nums[1:]:
if num < 0:
max_product, min_product = min_product, max_product
max_product = max(num, max_product * num)
min_product = min(num, min_product * num)
result = max(result, max_product)
return result
示例
nums = [2, 3, -2, 4] print(maxProduct(nums)) # 输出: 6
解释:
- 初始化时,
max_product
、min_product
和result
都设置为数组的第一个元素2
。 - 遍历数组:
- 对于
3
:max_product
更新为max(3, 2 * 3) = 6
min_product
更新为min(3, 2 * 3) = 3
result
更新为max(2, 6) = 6
- 对于
-2
:- 由于
-2
是负数,交换max_product
和min_product
,得到max_product = 3
,min_product = 6
max_product
更新为max(-2, 3 * -2) = -2
min_product
更新为min(-2, 6 * -2) = -12
result
保持为6
(因为-2
小于6
)
- 由于
- 对于
4
:max_product
更新为max(4, -2 * 4) = 4
min_product
更新为min(4, -12 * 4) = -48
result
保持为6
(因为4
小于6
)
- 对于
最终返回的 result
为 6
,即子数组 [2, 3]
的乘积。
复杂度分析:
- 时间复杂度:O(n),其中 n 是数组的长度,因为我们只需要遍历一次数组。
- 空间复杂度:O(1),因为我们只需要常数级别的额外空间来存储变量。
这种方法有效地处理了数组中包含负数的情况,确保能够找到最大的子数组乘积。
发表回复