나는이 증가하는 순서로 정수 배열을 취하는 프로그램을 만들고 단일 배열로 결합 될 때 원래의 배열을 생산 증가하는 순서로 K 비어 있지 않은 배열로 분할하는 것을 시도하고있다 - 첫 번째 배열이를 포함 할 수 없습니다하지만 첫 번째 이상 숫자 (K1 = [1,2,3] 잘못하지만 K1 = [2,3,4]가된다)
지금까지 나는 주어진 시도 가지고 array[4,7,11,21,31]
및 k=3
하드 코딩 존경 변수로 항목과 원래 배열의 복사 부분을 복사 할 위치에 포인터로 해당 법을 루프 - 두
int[] array = {1,2,3,4,5};
int k = 3;
int n = 5;
for(int i = 0; i <= n - k; i++){
for(int j = i+1; j < n-1; j++){
int[] k1 = Arrays.copyOfRange(array , 0, i+1);
int[] k2 = Arrays.copyOfRange(array , i+1, j+1);
int[] k3 = Arrays.copyOfRange(array , j+1, n);
}
}
위의 코드는 작동 k=3
하지만 문제는 내가 효율적으로 어떤 작동하는 방법을 모르는 것입니다 k
배열을 저장 효율적이고
최종 목표는 모든 가능한 조합을 생성하는 것입니다
정말 숫자의 배열을 분할하지 않습니다이 재귀 무차별 접근 방식은, 그것은 단지 분할이 발생 할 배열 항목의 인덱스를 반환합니다.
그것은 두 개의 인수를 취합니다
n
어레이의 길이k
원하는 부품의 수
그것은 반환 ArrayList<int[]>
분할 (인덱스와의 어레이로서 그 각각의 모든 가능한 조합을 포함하는 k-1
오름차순 요소).
나는 어떤 경우를 시도하고 그것은 작동하는 것 같다. 예상대로, 항상 이항 계수 반환 할 것 같다 (n-1) over (k-1)
조합의 양을. 길이 어떤 배열에 있기 때문이다 n
가 n-1
이 두 가지로 분할 할 수있는 장소. 우리는 그것을 분할 할 k-1
(와 최종하지만, 번 k
부품). 그래서 기본적이 선택된다 k-1
로부터 n-1
따라서 이항 계수.
public static ArrayList<int[]> getSplits(int n, int k) {
if (k == 1) {
return new ArrayList<int[]>();
}
ArrayList<int[]> newSplits = new ArrayList<int[]>();
for (int s = 1; s < n-(k-1)+1; s++) {
if (k == 2) {
newSplits.add(new int[] {s});
} else {
ArrayList<int[]> splits = getSplits(n-s, k-1);
for (int[] split : splits) {
int[] newSplit = new int[split.length + 1];
newSplit[0] = s;
for (int i = 0; i < split.length; i++) {
newSplit[i+1] = split[i] + s;
}
newSplits.add(newSplit);
}
}
}
return newSplits;
}
질문의 맥락에서 사용 :
이에서 배열 부분을 얻으려면, 당신은이 기능을 사용할 수 있습니다. 그들 파이프 심볼들로 분리 출력한다 ( |
).
public static void main(String args[]) {
int[] array = new int[] {1, 2, 3, 4};
int n = array.length;
int k = 3;
ArrayList<int[]> splits = getSplits(n, k);
for (int[] split : splits) {
int j = 0;
for (int i = 0; i < split.length; i++) {
for (; j < split[i]; j++) {
System.out.print(array[j] + " ");
}
System.out.print("| ");
}
for (; j < n; j++) {
System.out.print(array[j] + " ");
}
System.out.println();
}
}
이 인쇄 다음 (모든 possibilites 3 비어 있지 않은 그룹으로 4 개 항목을 분할) :
1 | 2 | 3 4
1 | 2 3 | 4
1 2 | 3 | 4