[LeetCode] 53 최대 부분 배열 해결 보고서 (파이썬)

면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
이 링크 : https://blog.csdn.net/ttinch/article/details/102566778

주제 주소 : https://leetcode.com/problems/maximum-subarray/

제목 설명

정수 배열 nums 주어 큰 합을 갖는 (적어도 하나 개의 번호를 포함하는) 인접한 서브 어레이를 발견하고 그 합을 반환한다.

예:

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

후속 :

당신은 O (n)의 솔루션을 알아 낸 경우, 더 미묘한 인 접근 방식을 나누기를 사용하여 다른 솔루션을 코딩 시도하고 정복.

해결 방법 1 : 동적 프로그래밍

[ 나는 ] = [ 나는 - 1 ] + 에스 [ 나는 ] [ 나는 - 1 ] 0 d p [ i ] = s [ i ] d p [ i 1 ] < 0 . \ 시작 {행렬} DP가 [I]가 = DP [I-1] + S [I] (DP) [I-1] \의 GEQ 0 \\ DP [I] =에서 S [I] (DP) [I-1] < 0 \ {단부 매트릭스}.

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        p = [0 for i in range(len(nums))]
        p[0] = nums[0]
        max_num = p[0]
        for i in range(1,len(p)):
            p[i] = p[i-1] * (p[i-1] > 0) + nums[i]
            max_num = max(max_num, p[i])
        return max_num

해결 방법 2 : 분할 및 정복

나누고 전략 컨커
어레이는 두 부분으로 나누어 져, 가장 큰 서브 어레이가 존재한다 :

  • 어레이의 왼쪽에 가장 큰 서브 어레이
  • 어레이의 오른쪽에서 가장 큰 서브 어레이
  • 최대 최대는 권리 + 왼쪽 경계에 배열의 오른쪽에 왼쪽 경계에 배열의 부분 배열을 서브 어레이
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        return self.solve(nums, 0, len(nums)-1)

    def solve(self, nums: List[int], low: int, high: int) -> int:
        if low == high:
            return nums[low]
        mid = low + int((high-low)/2)
        leftMax = self.solve(nums, low, mid)
        rightMax = self.solve(nums, mid+1, high)
        leftSum = nums[mid]
        tmp = nums[mid]
        for i in range(mid-1, low-1, -1):
            tmp += nums[i]
            leftSum = max(leftSum, tmp)
        rightSum = nums[mid+1]
        tmp = nums[mid+1]
        for i in range(mid+2, high+1):
            tmp += nums[i]
            rightSum = max(rightSum, tmp)
        return max([leftMax, rightMax, leftSum+rightSum])

분할 및 정복 및 동적 프로그래밍의 차이

  • 하위 문제를 중복 여부

분할 재귀 원래의 문제와 문제의 솔루션의 각 서브 과제 해결 해결 독립 하위 문제들로 문제 나누는 수단 정복 수득 서브 병합. 반면, 아이 독립적 겹치는 경우에 적합한 동적 프로그래밍, 즉, 서브 - 서브 - 서브 문제 일반적인 문제를 포함한다.

추천

출처blog.csdn.net/ttinch/article/details/102566778