최대 시퀀스 LeetCode 제품 152

면책 조항 :이 문서는 블로거 원본입니다은 허용 블로거없이 복제 할 수 없다. https://blog.csdn.net/Oscar6280868/article/details/89598963

이 질문은, 정수의 배열을 주어진 가장 큰 연속 서브의 제품을 반환, 제목은 다음과 같습니다
이름
각주기를 기록, 배열의 모든 요소를 통해 루프의 두 레이어를 통해 우리가 확실히 폭력적인 솔루션이라고 생각합니다 타이틀을 얻기 위해 주기가 끝날 때까지 제품의 글로벌 최소 후, 우리는 가장 큰 연속 서브의 제품이 솔루션의 시간 복잡도에 도달 할 것이 분명 얻을 수 있습니다 ( ) O (n ^ 2) .
솔루션의 폭력에 더하여, 우리는이 문제를 해결하기 위해 동적 프로그래밍 DP를 사용할 수 있는지 여부에 대해 생각할 수있는, 그럼 어떻게 DP 그것? 이것은 우리가 이하의 처리를 보면 :
순서도
표제 경우, 예를 들면, 먼저 배열 부정적인 이유가있을 수 있음을 고려로, 우리는 2 차원 어레이를 정의 할 수 있고,이 경우의 DP 과정을 살펴 번째 차원 같다 0 시간 (1)과 동일 시간의 최대 값 최소값 최대 값과 입술 동적 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

우리는 역동적 인 대화를위한 데이터 위의 데이터의 한 라운드가 필요합니다, 당신은 쉽게이 문제를 해결할 수 있습니다, 감사합니다.

추천

출처blog.csdn.net/Oscar6280868/article/details/89598963