Leetcode53. 서브 시퀀스 최대 (최대 연속 부분 배열)

링크 : 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에 } 반환 년; } };

추천

출처www.cnblogs.com/reflecter/p/12032693.html