最大シーケンスのLeetCode 152製品

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/Oscar6280868/article/details/89598963

この質問は、整数の配列を与えられた最大の連続サブシーケンスの積を返しますされ、タイトルは次のとおりです。
タイトル
各サイクルを記録し、アレイ内のすべての要素をループの2層を通して、我々は確かに暴力的な解決策だと思いますタイトルを取得しますサイクルの終わりまで、製品のグローバル最小の後、我々は最大の連続サブシーケンスの製品を得ることができるソリューションの時間複雑に達したことは明らかです ザ・ n個 2 O(n^2)
ソリューションの暴力に加えて、私たちは、あなたがこの問題を解決するために、動的プログラミングDPを使用できるかどうかを考えることができ、その後、どのようにDPそれ?これは、我々は次のプロセスを見て:
フローチャート
タイトルケースに、例えば、我々は最初の配列が負の理由を持っていることを考慮すると、すべての、我々は2次元配列を定義することができ、この場合のDPプロセスを見て、二次元に等しいです0時間、1に等しい時間の最大値が最小値、最大値及びRES動的プログラミングDPの終了まで、各レコードを表します。以下のようにコードは次のとおりです。

パイソン:
class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if nums is None: 
            return 0
        dp = [[0 for _ in range(2)] for _ in range(2)]
        
        dp[0][0], dp[0][1], res = nums[0], nums[0], nums[0]
        
        for i in range(1, len(nums)):
            x, y = i % 2, (i - 1) % 2
            dp[x][0] = max(dp[y][0] * nums[i], dp[y][1] * nums[i], nums[i])
            dp[x][1] = min(dp[y][0] * nums[i], dp[y][1] * nums[i], nums[i])
            res = max(res, dp[x][0])
            
        return res

このようなアプローチに加えて、我々はさらに、コードを簡略化することができます。

class Solution(object):
    def maxProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if nums is None: 
            return 0
        res, curMin, curMax = nums[0], nums[0], nums[0]
        
        for i in range(1, len(nums)):
            curMin, curMax = curMin * nums[i], curMax * nums[i]
            curMin, curMax = min(curMax, curMin, nums[i]), max(curMax, curMin, nums[i])
            res = curMax if curMax > res else res
        return res

私たちは、あなたが簡単にあなたに感謝し、この問題を解決することができ、動的な対話のためのデータを上記データの1ラウンドを必要としています。

おすすめ

転載: blog.csdn.net/Oscar6280868/article/details/89598963