생각 : $ 합은 [J]를 $ 해답과 비교하여 $ 합 [N] $로 해결 시퀀스 J 요소 및 서브 문제 전에 최대 서브 세그먼트이다. 그러나, 방법 $ 합을 사용하여, [1, 2, ..., J - 1] $ $을 합계 [J]를 $ 그것을 해결? 분명히 분명히 하위 상태 전이의 문제를 해결, 최대 필드 전 J-요소 하위 세그먼트의 시작과 끝 위치를 알고 더 복잡합니다.
그것은 또 다른 생각을 넣습니다. 두 아이디어 : $ [j]가 $ 아이 서브 세그먼트 및 문제 해결, $의 MAX_ {1 당량 J의 당량에의 j 번째 엘리먼트의 상기 제 1 단부와 최대 서브 세그먼트이고 합계 N} (합계 [J]) $가 전체이며 가장 큰 서브 세그먼트 시퀀스. $ 합 스루 [J-1] 현재 요소와 nums [J]를 $의 j 번째 엘리먼트의 최대 서브 세그먼트이고 계산 종료 $ 합 [J] $ 될 수 $ $ 状态转移方程다음과 같다 . $$ 합계 [j 개의 + 1 = {이 경우} nums 시작 [ J + 1] 합계 [J] LT 0 CR 합 [J] + nums [J + 1] 다른 케이스 {} 최종 $$
클래스 { 공개 : INT maxSubArray ( 벡터 < INT > & nums) { INT SizeofNums nums.size = (); 경우 (SizeofNums == 1 ) { 리턴 nums [ 0 ]; } INT의 합 [SizeofNums]; 합 [ 0 ] = nums의 [ 0 ]; 대 ( int로는 I = 1 ; i가 SizeofNums를 <; 내가 ++) { 합계 [I] = 합계 [I -1 ] < 0 ? nums [내가] 합계 [I -1 ] + nums [I]; }
INT largestSum는 합계 = [ 0 ]; 위한 ( int로 I = 1 ; i가 SizeofNums를 <; 내가 ++) { 경우 (largestSum <합 [I]) { largestSum = 합계를 [I]; } } 반환 largestSum을; } };
얻기 위해 largestSum우리가 할 수있는 변수에 대응하는 시퀀스 startIdx끝 j 번째 엘리먼트를 기록 ( endIdx개시 위치) 및 최대 서브 세그먼트에 대응하는 서브 시퀀스 $의 nums를 [startIdx는 ... endIdx] $는 해당 순서이고; 또한, 고려 현재 상태에만 관련된 이전 상태를 , 그 취득 회피하면서, 메모리를 절약하는 대신 배열 변수를 사용할 수있는 The largest sum of the whole array시간의주기를 반복.
클래스 해결 { 공개 : INT maxSubArray ( 벡터 < INT > & nums) { INT SizeofNums nums.size = (); 경우 (SizeofNums == 1 ) { 리턴 nums [ 0 ]; } 현재 요소 끝 부분 배열 용 // 최대 합 INT curSum nums = [ 0 ]; 전체 어레이 배열의 // 최대 합 INT largestSum = curSum; // 서브 어레이 [startIdx, endIdx] 전체 어레이의 최대 합 INT startIdx = 0 , = endIdx
0 ; 위한 ( int로 I = 1 ; i가 SizeofNums를 <; 내가 ++) { 경우 (커서 < 0 ) { 커서 nums = [I]; startIdx = 1; } 그렇지 { 커서 속도 + = nums [I]; } 인 경우 (주자> largestSum) { largestSum = 속도; endIdx = 1; } } 반환 largestSum을; } };