면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
[LeetCode] 53 최대 부분 배열 해결 보고서 (파이썬)
주제 주소 : 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 : 동적 프로그래밍
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])
분할 및 정복 및 동적 프로그래밍의 차이
- 하위 문제를 중복 여부
분할 재귀 원래의 문제와 문제의 솔루션의 각 서브 과제 해결 해결 독립 하위 문제들로 문제 나누는 수단 정복 수득 서브 병합. 반면, 아이 독립적 겹치는 경우에 적합한 동적 프로그래밍, 즉, 서브 - 서브 - 서브 문제 일반적인 문제를 포함한다.