정수 배열을 지정해
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 중간 위치를 포함