[알고리즘] 가장 긴 통합 가능 한 배열 의 길이
만약 한 배열 이 다시 정렬 한 후에 인접 한 두 개의 수차 의 절대 값 이 모두 1 이 라면 이 배열 은 통합 가능 한 배열 이다.예 를 들 어 [5, 3, 4, 6, 2] 순 서 를 매 긴 후에 [2, 3, 4, 5, 6] 이 고 인접 한 두 수의 차 에 부합 되 는 절대 치 는 1 이기 때문에 이 배열 은 통합 가능 한 배열 이다.
전체 배열 을 지정 하 였 습 니 다. 하위 배열 을 통합 할 수 있 는 최대 길 이 를 되 돌려 주 십시오.예 를 들 어 [5, 5, 3, 2, 6, 4, 3] 의 최대 통합 가능 한 서브 배열 은 [5, 3, 2, 6, 4] 이 므 로 5 로 돌아간다.
방법 1:
1. 각 하위 배열 의 arr [i... j] 를 차례대로 살 펴 보면 모두 O (N ^ 2) 개가 있다.
2. 모든 하위 배열 에 대해 새로운 배열 로 복사 하고 new Arr 로 기록 한 다음 new Arr 를 정렬 한 다음 통합 가능 한 배열 의 정의 에 부합 되 는 지 검증 합 니 다. 이 단계 의 대 가 는 O (NLogN) 입 니 다.
3. 단계 2 에서 조건 에 부합 되 고 가장 큰 하위 배열 의 길이 가 결과 이다.
시간 복잡 도: O (N ^ 3logN)
public static int getLIL1(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int len = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = i; j < arr.length; j++) {
if (isIntegrated(arr, i, j)) {
len = Math.max(len, j - i + 1);
}
}
}
return len;
}
public static boolean isIntegrated(int[] arr, int left, int right) {
int[] newArr = Arrays.copyOfRange(arr, left, right + 1); // O(N)
Arrays.sort(newArr); // O(N*logN)
for (int i = 1; i < newArr.length; i++) {
if (newArr[i - 1] != newArr[i] - 1) {
return false;
}
}
return true;
}
방법 2:
첫 번 째 방법 은 제목 의 뜻 에 따라 모든 하위 배열 이 통합 가능 한 배열 인지 엄 격 히 검증 하지만 배열 이 통합 가능 한 배열 인지 아 닌 지 를 판단 하 는 데 다음 과 같은 방법 으로 판단 할 수 있다. 한 배열 에 중복 요소 가 없 으 면 최대 치 에서 최소 치 를 빼 면 1 의 결 과 는 요소 의 개수 (max - min + 1 = 요소 개수) 와 같다.그럼 이 배열 은 통합 가능 한 배열 입 니 다.
이렇게 해서 하나의 배열 이 배열 을 통합 할 수 있 는 시간 복잡 도 인지 검증 하면 첫 번 째 방법의 O (NLogN) 에서 O (1) 로 줄 일 수 있 고 전체 과정의 시간 복잡 도 는 O (N ^ 2) 이다.
public static int getLIL2(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int len = 0;
int max = 0;
int min = 0;
HashSet<Integer> set = new HashSet<>(); //
for (int i = 0; i < arr.length; i++) {
max = Integer.MIN_VALUE;
min = Integer.MAX_VALUE;
for (int j = i; j < arr.length; j++) {
if (set.contains(arr[j])) {
break;
}
set.add(arr[j]);
max = Math.max(max, arr[j]);
min = Math.min(min, arr[j]);
if (max - min == j - i) {
len = Math.max(len, j - i + 1);
}
}
set.clear();
}
return len;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.