LeetCode는 689. 주문 3 비 중복 서브 어레이 제일 시간의 최대 합계 및 판매 증권 III

여기에 원래 제목 링크 : 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 }

类似구매 및 판매 증권 III에 가장 좋은 시간이다 .

추천

출처www.cnblogs.com/Dylan-Java-NYC/p/12010372.html