Maximum Product Subarray,LeetCode,152

题目描述

给定一个整数数组 nums,找出一个连续子数组(至少包含一个数字),使得该子数组的乘积最大。

示例

输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 的乘积最大为 6。

解题思路

这道题可以使用动态规划来解决。由于数组中可能包含负数,我们需要维护两个变量:max_productmin_product,分别表示当前的最大乘积和最小乘积。因为负数乘以负数会变成正数,所以当前的最小乘积可能会成为未来的最大乘积。

具体步骤

  1. 初始化 max_productmin_product 为数组的第一个元素。
  2. 遍历数组,对于每个元素 num
    • 如果 num 是负数,交换 max_productmin_product
    • 更新 max_productmax(num, max_product * num)
    • 更新 min_productmin(num, min_product * num)
    • 更新全局最大乘积 resultmax(result, max_product)
  3. 返回 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

解释

  1. 初始化时,max_productmin_productresult 都设置为数组的第一个元素 2
  2. 遍历数组:
    • 对于 3
      • max_product 更新为 max(3, 2 * 3) = 6
      • min_product 更新为 min(3, 2 * 3) = 3
      • result 更新为 max(2, 6) = 6
    • 对于 -2
      • 由于 -2 是负数,交换 max_productmin_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

最终返回的 result6,即子数组 [2, 3] 的乘积。

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度,因为我们只需要遍历一次数组。
  • 空间复杂度:O(1),因为我们只需要常数级别的额外空间来存储变量。

这种方法有效地处理了数组中包含负数的情况,确保能够找到最大的子数组乘积。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注