1. 問題描述:
給你一個整數數組 nums ,請你找出數組中乘積最大的連續子數組(該子數組中至少包含一個數字),並返回該子數組所對應的乘積。
示例 1:
輸入: [2,3,-2,4]
輸出: 6
解釋: 子數組 [2,3] 有最大乘積 6。
示例 2:
輸入: [-2,0,-1]
輸出: 0
解釋: 結果不能爲 2, 因爲 [-2,-1] 不是子數組。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-product-subarray
2. 思路分析:
一開始的時候感覺應該使用的動態規劃來解決的,動態規劃一般是通過數組來實現的,對於python語言來說可以使用list列表來實現,但是並沒有很明確的思路,在評論區中發現一位大佬的解法非常棒,他的做法是維護兩個變量,到當前位置的的子數組的最大乘積與最小乘積,記錄最小乘積主要是出現負號的情況有可能乘以當前數字之後會得到目前的最大值了,這個動態規劃求解的思路是非常值得借鑑的
3. 代碼如下:
from typing import List
class Solution:
# 使用打斷點的方法來理解其中的思路過程
def maxProduct(self, nums: List[int]) -> int:
if not nums: return
res = nums[0]
pre_max = nums[0]
pre_min = nums[0]
for num in nums[1:]:
cur_max = max(pre_max * num, pre_min * num, num)
cur_min = min(pre_max * num, pre_min * num, num)
res = max(res, cur_max)
pre_max = cur_max
pre_min = cur_min
return res