K-배열로 분할 배열의 효율적인 방법을 찾고

존 미상 :

나는이 증가하는 순서로 정수 배열을 취하는 프로그램을 만들고 단일 배열로 결합 될 때 원래의 배열을 생산 증가하는 순서로 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배열을 저장 효율적이고

최종 목표는 모든 가능한 조합을 생성하는 것입니다

theblackips :

정말 숫자의 배열을 분할하지 않습니다이 재귀 무차별 접근 방식은, 그것은 단지 분할이 발생 할 배열 항목의 인덱스를 반환합니다.

그것은 두 개의 인수를 취합니다

  • n 어레이의 길이
  • k 원하는 부품의 수

그것은 반환 ArrayList<int[]>분할 (인덱스와의 어레이로서 그 각각의 모든 가능한 조합을 포함하는 k-1오름차순 요소).

나는 어떤 경우를 시도하고 그것은 작동하는 것 같다. 예상대로, 항상 이항 계수 반환 할 것 같다 (n-1) over (k-1)조합의 양을. 길이 어떤 배열에 있기 때문이다 nn-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 

추천

출처http://43.154.161.224:23101/article/api/json?id=202810&siteId=1