leetcode 第152題 乘積最大子序列 python解法

leetcode 第152題 乘積最大子序列 python解法

問題分析

在這裏插入圖片描述
題目的要求是在一個整數數組中找到乘積最大的一個連續子序列,數組裏的數可正可負可零。
首先用一個具體的例子來講解一下我的思路,假設所給的數組如下:
[2, -1, 4, -2, -3, 0, 1, 2]
先定義最大的數爲數組的第一個元素,即2,並設置當前數爲1。然後從左向右遍歷,在沒有遇到零之前,將遍歷的數不管是正數還是負數都乘上當前數。如果當前數大於最大的數,那麼將最大的數替換成當前數。如果遇到零,那麼將當數重新設置爲1,繼續遍歷。 等到遍歷完數組後,所得到的最大數就是從左到右遍歷的最大值。
細心的人可以發現,如果按照上述的方法對數組操作,那麼最後得到的最大數爲2 x (-1) x 4 x (-2) = 16。然而這並不是正確的結果,最終的答案應該是4 x (-2) x (-3) = 24。
那這是爲什麼呢?原因就是我只進行了從左向右的遍歷。假設數組中包含有多個負數,像上面的數組一樣,將它們之間的正數拿掉,負數的排列爲-1, -2, -3。如果負數的個數是偶數還好辦,完全不影響。但是是奇數時,就存在一個取捨的問題—即捨去第一個負數,還是最後一個負數。如果只進行從左到右的遍歷,那麼捨去的肯定將是最後一個負數,這樣很可能得到錯誤的結果(例如上面)。怎樣克服這個問題呢?很簡單,在進行一次從右向左的遍歷,並將遍歷時得到的最大值與之前的最大值比較。
因爲從左向右遍歷和從右向左遍歷在遇到同一列奇數個負數時,分別捨棄的正好是第一個和最後一個負數,這樣的話就不會漏掉所有情況了。
還有一點要注意的是,上面說的一列負數的要求是負數之間是不存在零的,假如有零的話,就要分段考慮。

源碼

class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        ret = nums[0]
        temp = 1
        for i in nums:
            temp *= i
            ret = temp if temp > ret else ret
            temp = 1 if temp == 0 else temp
        temp = 1
        for i in nums[::-1]:
            temp *= i
            ret = temp if temp > ret else ret
            temp = 1 if temp == 0 else temp
        return ret

感謝大家觀看

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章