예를 들어, 입력 배열은, 서브 {3,10 서브 어레이, -4,7,2} 출력의 최대 {1, -2,3,10, -4,7,2, -5}이고 및도 18의 배열.
주제를 참조하십시오, 많은 사람들이, 즉 배열과 그들을 발견하고 모든 하위 배열을 열거하는 가장 직관적 인 방법으로 생각할 수 있습니다. 길이 N의 배열, N의 합계 (N + 1) / 2 서브 어레이. 모든 하위 배열을 계산하고, 또한 빠른 O (N2) 시간이 필요합니다. 일반적으로 가장 직관적 인 방법이 가장 좋은 방법은 아닙니다, 면접관이 빠른 방법을 우리를 묻는 메시지가 표시됩니다.
해결책 하나로서는 배열 규칙 성
우리는 개별적으로 머리와 꼬리의 배열의 각 샘플에 대한 번호를 축적했습니다. 0 단계 초기화 및 첫 번째 번호를 추가하고, 1. 다음 단계 디지털 경우에 -2와 -1 프로그램. 우리는 디지털주의 3 단계 이 축적 전에 -1 미만 0, -1 3을 첨가하고, 그 자체보다 2, 3보다 작은 경우 얻었다. 시작점과 첫 번째 숫자로부터의 서브 어레이는 제 자리 그리고 처음부터 서브 어레이보다 작아야한다. 따라서, 우리는 첫 번째 하위 배열을 고려하지 않고, 또한 포기하기 전에 축적.
우리는 제 누적부터 다시 시작이 때 얻어진 제 4 단계 3. 다음 우리가 부정적이 발견 (10), 제 5 단계를 얻고 추가 -4 인 13, 및도 9를 추가 -4 따라서 축적 -4 원래보다 작아 후의. 13 우리 넣어하기 전에 보존 따라서는, 그 가장 큰 서브 어레이 가능하다. 결과 디지털 7,9 제 6 단계 (16)는 플러스 7이고, 이전보다 시간이 가장 크고 13에서, 최대 서브 어레이 (2)를 추가의 13 (16)에 제 7 단계, 축적에서 업데이트되고 우리가 업데이트되고 가장 큰 서브 어레이에있는 동시에, (18)을 생성하고. 최종 및 최대 서브 어레이 (18)는 서브 어레이는 {3,10, 4,7- 대응되도록 얻어진 결과부터 여덟 번째 단계 플러스 마지막 자리 -5, (13), 최대 값과 이전에 취득한 미만 18 2}.
public Integer findGreatestSum(int[] arr){
if(arr.length ==0)
return null;
int greatest = 0x80000000;
int curSum = 0;
for(int i = 0;i<arr.length;i++){
if(curSum <= 0)
curSum = arr[i];
else
curSum += arr[i];
if(curSum >greatest)
greatest = curSum;
}
return greatest;
}
솔루션 II : 동적 프로그래밍의 응용 프로그램
우리는 또한 동적 프로그래밍의 개념은 문제가 적용 분석 할 수 있습니다. 마지막에 제 i 서브 어레이 및 최대 개수로 표현하면, 우리 맥스 찾아야 [F를 (I)], 여기서, 0 <= I <N 함수 f에 의해 (I). 우리는 다음과 같은 재귀 대중이 (내가) f를 추구 할 수 있습니다 사용할 수 있습니다 :
화학식 의미 : 숫자의 제 1 서브 어레이는 I-1 단부는 0보다 작은 때, 그리고 i- 번째 자리 자체보다 작은 모든 숫자 i 번째 네거티브 축적 이어진다면 따라서이 경우, i 번째의 서브 어레이는 i 번째 자리 자체의 끝 수가있다. 모든 숫자가 끝나는 제 I-1 자리 부분 배열을위한 도면으로, 0보다 크면, i 번째의 서브 어레이는 i 번째 자리의 단부 및 모든 숫자를 얻는다.