이 기사에서는 배열에 대한 가장 긴 후속 알고리즘의 Java 구현에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
문제 : 길이 n 배열이 주어지면 가장 긴 단조로운자가 확보 하단 시퀀스를 찾으십시오 (반드시 연속적이지는 않지만 순서를 엉망으로 만들 수는 없습니다). 예를 들어, 길이가 8 인 {1, 3, 5, 2, 4, 6, 7, 8}의 배열이 주어지면 가장 긴 단조 앰플 리콘 시퀀스는 {1, 2, 4, 6, 7, 8}이며 길이는 6입니다.
아이디어 1 : 처음에 질문을 볼 때 많은 사람들이 처음으로 LC를 생각할 것입니다. 먼저 배열을 새 배열로 정렬 한 다음 새 배열과 원래 배열을 사용하여 LCS를 찾아 답을 얻으십시오. 많은 사람들 이이 솔루션을 상상할 수 있으므로 자세한 내용은 없습니다.
아이디어 2 : 아이디어 1의 아이디어에 따르면, LC를 마침내 찾을 때 여전히 DP를 사용해야합니다. DP를 사용하여 직접 해결하지 않는 이유는 무엇입니까? 배열 ARR의 경우 배열을 뒤에서 앞으로 횡단하고 후속 시퀀스가 arr[i] 로 끝날 때 가장 긴 하속을 찾은 다음 최대 값을 가져옵니다. 전체 배열의 가장 긴 후속을 얻을 수 있습니다. 그렇다면 arr[i] 로 끝나는 가장 긴 후속을 찾는 방법은 무엇입니까? 이것은 DP 문제로 변환됩니다. arr[i] 의 가장 긴 하속을 요구하려면 arr[i-1] 의 가장 긴 하속 만 찾기 만하면됩니다. 즉, max{arr[i]}=max{arr[i-1]}+1 .
Java 구현 코드 :
public class arrdemo {public static void main (String [] args) {// int [] arr = {89, 256, 78, 1, 46, 78, 8}; int [] arr = {1, 3, 5, 2, 4, 6, 7, 8}; // int [] arr = {6, 4, 8, 2, 17}; int max = 0; int maxlen = arr.length; // 배열을 뒤에서 앞으로 횡단하고 (int i = arr.length-1; i> 0; i-) {int [] newarr = new int [i]; System.ArrayCopy (Arr, 0, Newarr, 0, i); int currentLength = 1 + dp (newarr, arr [i]); if (currentLength> max) max = currentLength; // 가장 긴 후속의 가장 긴 길이는 원래 배열의 길이입니다. // 가장 긴 하속의 요소를 찾을 필요가 없기 때문에 (max == maxlen) break if 시간 간단한 시간을 줄이기 위해 루프를 직접 종료합니다. } system.out.println (max); } public static int dp (int [] arr, int end) {// 재귀 종료 조건 if (arr.length == 1) {// 끝보다 작 으면 후속 시퀀스 +1의 길이 (arr [0] <= end) 반환 1; 그렇지 않으면 0; } // 배열을 가로 지르고 엔드에 가장 가까운 요소 위치를 찾으십시오. <= end i for (int i = arr.length-1; i> = 0; i-) {if (arr [i] <= end) {// 배열을 i에서 자르고 ARR [0] to arr [i-1]에 새로운 배열을 형성하여 길이 int [] 새로운 int [i]; System.ArrayCopy (Arr, 0, Newarr, 0, i); // ARR [i]를 포함하지 않을 때 ARR [I] 및 가장 긴 하단을 포함 할 때 가장 긴 하속을 계산하고 최대 값 int containSlen = dp (newarr, arr [i]) + 1; int notcontainlen = dp (newarr, end); Return inclondLen> notContainLen? ContainSlen : notcontainlen; }} // 끝보다 작은 것이 없으면 반환 길이는 0 리턴 0입니다. }}실행 결과 :
6
여러 개의 새로운 배열이 중간에 열리기 때문에 내 방법이 많은 공간을 차지할 수 있지만, 그다지 많지 않다고 생각합니다. 잘못된 것이 있으면 수정하십시오.
Java 알고리즘에 대한 자세한 내용은이 사이트에 관심이있는 독자들이 주제를 볼 수 있습니다. "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작동 팁 요약"및 "Java Cache Operation Tips의 요약"을 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.