[53] 최대 서브 어레이

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

예:

입력 : [-2,1, 설 포닐, -1,2,1, -5,4], 
출력 : 6 
명 : [4 -1,2,1] 최대 합 = 6을 갖는다.

후속 :

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

solution1 (DP) :

감사  카카 밀도 ( https://leetcode.com/density/ ) DP 정책은 여기에 내가 뻔뻔 복사 및 붙여 넣기 오전, 이해하기 쉽고 간단합니다.

아이디어 : 이전 위치의 합이 음수 인 경우 nums 들어 [I]는 위치의 관점에서, 그 위치의 이전 값은 완전히 폐기한다 이전 값의 위치가 긍정적 인 경우, 그 위치를 추가한다. (필자는 최적의 솔루션이 특정 숫자 사이의 경우는 첫 번째 경우는 실제로 설정되어있는 경우, 이전 위치의 모든 요소를 ​​의아해되어 있고 음수가 될 것입니다 ... 과연 내가 너무 용인 한 너무 간단)

1 개  솔루션 {
 2  공개 :
 3      INT maxSubArray (벡터 < INT > & nums) {
 4        벡터 < INT > DP {nums [ 0 ]};
도 5        에 대한 ( int로 난 = 1 ; i가 nums.size ()을 <; 내가 ++ )
 6        {
 7          경우 (DP [I- 1 ] < 0 )
 8          {
 9            dp.push_back (nums [I]);
10          }
 11          
12          {
 13           dp.push_back (DP [I- 1 ] + nums [I]);
14          }
 15        }
 16          리턴 *의 max_element (dp.begin () dp.end ());
17      }
 18 };

solution2 (및 분할 정복)

아이디어 :

가능한 최적의 솔루션의 세 가지 종류 :

왼쪽 중간 위치 1. 완전히

오른쪽 중간 위치에서 2. 완전히

3 중간 위치를 포함

 

 

추천

출처www.cnblogs.com/Swetchine/p/11223362.html