1. 程式人生 > 實用技巧 >動態規劃之三乘積最大子陣列

動態規劃之三乘積最大子陣列

題目描述:給你一個整數陣列 nums ,請你找出陣列中乘積最大的連續子陣列(該子陣列中至少包含一個數字),並返回該子陣列所對應的乘積。

示例 1:
輸入: [2,3,-2,4]            輸出: 6
解釋: 子陣列 [2,3] 有最大乘積 6。

示例 2:
輸入: [-2,0,-1]    輸出: 0
解釋: 結果不能為 2, 因為 [-2,-1] 不是子陣列。

解題思路
這一題和最大子陣列和不同的地方在於,加法只要累加就可以找到最大和,但是乘法會出現負負得正的場景。所以,當一個負數 × 負數的最小值,就能得到一個最大值。為了解決這種問題,需要同時記錄最大值和最小值,最大值遇到負數會變成最小值,最小值遇到負數會變成最大值。

同時該題並不需要維護一個dp陣列,因為最大值乘積是一個數值,並且這個數值只和當前數值與前一個最大值和最小值有關,所以維護一個最大值和一個最小值就能夠完成求解。

def max_multiply(arr):

    max_value = arr[0]
    min_value = arr[0]
    res = arr[0]
    for i in arr[1:]:
        pre_max = max_value
        # 先求出最大值,再和當前值比較,找到最大值
        max_value = max(i, max(i*max_value,i*min_value))

        # 先求出最小值,在和當前值比較,找到最小值
        min_value = min(i, min(i*pre_max,i*min_value))
        res = max(max_value,min_value)
    return res
    
arr = [5,6,-3,4,-3]
res = max_multiply(arr)
print(res)