시간은 안전의 서비스를 30 효율과 최대 연속 부분 배열을 증명하기 위해

제목 설명

HZ 가끔 그 이외의 컴퓨터 과학 학생을 깜박 일부 전문적인 문제를 얻는다. 테스트 그룹이 오늘 종료됩니다 후, 그는 일 말했다 : 벡터는 양의 정수, 해결할 문제가있을 때 이전 차원 패턴 인식에서, 종종 최대 연속 서브 벡터를 계산하는 것이 필요하다. 벡터가 음수를 포함하는 경우에는, 그것을 만회 할 옆에 양수를 음수를 포함하고 기대해야합니까? 예를 들면 : {6, -3, -2,7-, -15,1,2,2}, 및 (8)의 최대 연속 서브 벡터 (제까지 0에서 시작). 최대 연속 서브 배열 및 반환하고 당신이 그를 살 속지 않을 것이다? (부 벡터의 길이는 적어도 1)
잘못된 솔루션 :
공용  클래스 FindGreatestSumOfSubArray { 
    
 공공  INT FindGreatestSumOfSubArray ( INT [] 배열) { 
    
    INT의 결과 = 0 ;
    만약 (인 Array.length == 1 ) {
         리턴 어레이 [0 ]; 
    } 
    다른 {
     위해 ( int로 I = 0; I <사항 Array.length; 내가 ++ ) {
          ( INT의 J = 0; J <사항 Array.length, J ++ ) {
             INT의 합 = 0 ;
            동안 은 (i < J)를 { 
                합계 + =  배열 [I];
            }
          경우 (합계> 결과) { 
            결과 = 합; 
        } 
     } 
  } 
}       
     리턴 결과; 
                         }

 

올바른 문제 해결 방안 :
 
동적 프로그래밍을 사용하여
F (I) 배열 [I]는 배열의 마지막 요소와 최대치, 동일한 배열의 요소의 상대 위치 인
F (I) = 최대 (F (I-1) + 어레이 [i]는, 어레이 [I])
고해상도 : 모든 하위 배열과 최대
입술 = 최대 (입술, F (I))

배열 [6, -3, -2, 7, -15, 1, 2, 2]
초기 상태 :
    F (0) = 6
    입술 = 6
난 = 1 :
    F (1) = 최대 (F (0) -3, -3) = 최대 (6-3,3) = 3
    입술 = 최대 (F (1), 해상도) = 최대 (3,6) = 6
난 2 =
    F (2) = 최대 (F (1) -2, -2) = 최대 (3-2, -2) = 1
    입술 = 최대 (F (2), 해상도) = 최대 (1,6) = 6
난 = 3 :
    F (3) = 최대 (F (2) +7,7) = 최대 (1 + 7.7) = 8
    입술 = 최대 (F (2), 해상도) = 최대 (8,6) = 8
난 = 4 :
    F (4) = 최대 (F (3) -15, -15) = 최대 (8-15, -15) = - 7
    입술 = 최대 (F (4), 해상도) = 최대 (-7,8-) = 8
8 고해상도의 최종 값
public  int FindGreatestSumOfSubArray(int[] array) {
             int res = array[0]; //记录当前所有子数组的和的最大值
             int max=array[0];   //包含array[i]的连续数组最大值
             for (int i = 1; i < array.length; i++) {
                 max=Math.max(max+array[i], array[i]);
                 res=Math.max(max, res);
             }
             return res;
     }

 

추천

출처www.cnblogs.com/Transkai/p/11272826.html