여기에 원래 제목 링크 : https://leetcode.com/problems/maximum-sum-of-3-non-overlapping-subarrays/
주제 :
특정 배열에서, nums
양의 정수의 최대 합 세 겹치지 않는 서브 어레이를 찾는.
각 부분 배열의 크기가 될 것입니다 k
, 우리 모두의 합을 극대화 할 3*k
항목을.
각 간격의 시작 위치를 나타내는 인덱스리스트로서 결과를 리턴 (0 인덱스). 복수 응답이있는 경우, 전적으로 작은 하나를 반환합니다.
예:
입력 : [1,2,1,2,6,7,5,1] 2 출력 [0, 3, 5] 설명 : 서브 어레이 [1,2], [2,6], [7, 5 출발 인덱스에 대응하는 [0, 3, 5]. 우리는 또한 [2, 1] 촬영하지만, 수도의 답변 [1, 3, 5] 사 전적으로 큰 것입니다.
노트 :
nums.length
1과 20000 사이에있을 것입니다.nums[i]
1 65535 것이다.k
1 층 (nums.length은 / 3) 사이에있을 것이다.
해결 방법 :
nums의의 누적 합계를 가져옵니다.
반복 처리가에서 현재의 인덱스 왼쪽 가장 큰 부분 배열의 시작 인덱스를 얻기 위해 왼쪽에서 오른쪽으로.
오른쪽에서 왼쪽으로 반복 현재 지수에 가장 큰 부분 배열 오른쪽의 시작 인덱스를 얻을 수 있습니다.
이어서 중간 부분 인덱스는 [K, N-2 * K] 일 수있다. 반복 처리는 그들 각각, 왼쪽 가장 큰 시작 인덱스 오른쪽 가장 큰 시작 인덱스를 얻을.
세계 최대 고해상도를 업데이트하십시오.
시간 복잡도 : O (N). N = nums.length.
공간 : O (N).
AC 자바 :
1 급 솔루션 { 2 공개 INT [] maxSumOfThreeSubarrays ( INT [] nums, INT의 K) { 3 INT [] 입술 = 새로운 INT [3 ]; 4 Arrays.fill (입술, -1 ); 도 5 의 경우 (nums == 널 || nums.length <3 * K) { 6 복귀 입술; 7 } 8 9 INT N = nums.length; 10 INT는 [] 합계 = 새로운 지능 [N + 1 ]; (11) 위한 ( INT I = 0; I N <; I ++ ) { 12 합 [내가 + 1] = 합계 [I] + nums [I]; 13 } 14 15 INT [] = leftPo 새로운 INT [N]; 16 대 ( INT 나 K, 최대 = 합 [K] = - 합 [0]을; I <N는, I ++ ) { 도 17 의 경우 (합 [난 + 1] - 합 [난 + 1-K] " 최대) { 18 최대 = 합 [I + 1] - 합 [I + 1- K]; 19 leftPo [I] = 1 + 1 (K); 20 } 다른 { 21 leftPo [I] = leftPo [I-1]; 22 } 23 } 24 25 INT [] = rightPo 새로운 INT [N]; 26 rightPo [NK = NK ; 27 대 ( INT I = NK-1, 최대 합 = [N] - 합 [NK] I> = 0; 난 ... ) { 28 일 경우 (합 [I + K] - 합 [I]> = 최대) { 29 최대 = 합 [I + K] - 합 [I]; 30 rightPo [I] = I; 31 } 다른 { 32 rightPo [I] = rightPo [I + 1 ]; (33) } 34 } 35 (36) 에 대한이 ( INT가 나는 케이 = 최대 = 0; I <= N-2 * K; I ++ ) { 37 INT의 L = leftPo [I - 1 ]; 38 INT R = rightPo [I + K]; 39 의 경우 (합 [난 + K] - 합 [I] + 합 [1 + K] - 합 [L] + 합 [R + K] - 합 [R]> 최대) { 40 최대 = 합 [난 + K ] - 합 [I] + 합 [1 + K] - 합 [L] + 합 [R + K] - 합 (R); 41 입술 [0] = L; 42 입술 [1] = 난; 43 입술 [2] = R; 44 } 45 } 46 47 복귀 입술; 48 } 49 }