링크 : https://leetcode-cn.com/problems/maximum-subarray
nums에게 정수 배열을 감안할 때, 상기 연속하는 서브 어레이 (최소의 요소를 포함하는 서브 어레이)의 최대 수익을 갖는 최대 찾기.
예 :
입력 : [-2,1, 설 포닐, -1,2,1, -5,4],
출력 : 6
명 : 연속 서브 어레이 [4, -1,2,1], 최대 6이었다 .
고급 :
이 솔루션의 O (N)의 복잡성을 구현 한 경우, 분할 및 정복의보다 정교한 사용을 해결하려고합니다.
동적 프로그래밍 솔루션 :
최대 연속 부분 배열은 우리가 이미 하위 문제 [0, J]를 알고 있다고 가정하고, 지금 우리는 [0, J + 1] 가장 큰 연속 부분 배열입니다 고려해야합니다. 분명히, 우리는 다음과 같은 속성을 얻기
[0, J + 1] 가장 인접한 부분 배열 = 최대 ([0, J] 가장 인접한 서브 어레이, [I, J + 1] 가장 인접한 서브 어레이), 0 <= I <= J + 1.
그러나 i 및 j는 2 사이클로서, 직접 수행하는 경우 또는 시간 복잡도 O (N2)의.
실제로, [난, J + 1] 가장 인접한 서브 어레이는 연속적 최대 확장을 유지함으로써 달성 될 수 있으므로 그것에 대한 O (N)의 감속 시간 복잡도.
클래스 해결 { 공개 : INT maxSubArray (벡터 < INT > & nums)을 { INT ANS = nums [ 0 ] 의 INT left_pos = 0 , right_pos = 0 ; INT pre_sum = ANS, pre_left = 0 ;
대 ( INT I = 1이다. ] I <nums.size (); I는 ++ ) { // 상태 전이 방정식 DP의 pre_sum = 최대합니다 (nums + [I] 상기 nums을 [I]) pre_sum; // 최대 접미사 유지 ANS = (최대 ANS, pre_sum) // 최대 값을 취하는 부 문제 0 ... J 및 i..j + 1에 } 반환 년; } };