使用JAVA查找未排序数组中所有可能的连续子集

时间:2016-10-04 06:32:24

标签: java algorithm

假设我有5张牌,显然未分类,我怎么能找到 所有可能直线的长度 ? (直的长度至少为3)

Ace只会被视为1。

例如,如果我有一套牌:A(铲子)3(心脏)K(心脏)3(铲子)2(心脏)

期望的输出将是:3,3

另一个例子,如果我有一套牌:A(铲子)3(心脏)A(球杆)3(铲子)2(心脏)

期望的输出将是:3,3,3,3

1 个答案:

答案 0 :(得分:1)

如果您只对所有可能直道的长度感兴趣,可以使用组合学知识。

你有5张牌。让我们用数字代表他们。您将自己更改为Card

int[] filter = new int[13];
for (int i = 0; i < 5; i++) {
    filter[cards[i]]++;
}

int j = 0;
while (j < 13) {
    if (filter[j] > 0) {
        int length = 0;
        while (filter[j] > 0) {
            length++;
            j++;
        }
        if (length == 3) {
            for (int k = 0; k < filter[j - 1] * filter[j - 2] * filter[j - 3]; k++) {
                System.out.print(3 + " ");
            }
        }
        if (length == 4) {
            for (int k = 0; k < filter[j-1] * filter[j - 2] * filter[j - 3] * filter[j - 4]; k++) {
                System.out.print(4 + " ");
            }
            for (int k = 0; k < filter[j-1] * filter[j - 2] * filter[j - 3]; k++) {
                System.out.print(3 + " ");
            }
            for (int k = 0; k < filter[j - 2] * filter[j - 3] * filter[j - 4]; k++) {
                System.out.print(3 + " ");
            }
        }
        if (length == 5) {
            System.out.println("5 4 4 3 3 3");
        }
    }
    j++;
}

算法的想法是:

  1. 制作一个过滤器,每个单元格会显示您拥有的排名i的卡数。
  2. 搜索可以制作笔直的最长卡片序列。你只能有一个合适的长度。
  3. 根据序列的长度和每张卡片的出现次数打印每根直线的长度。
  4. 示例

    cards = {1, 2, 2, 3, 4];
    filter = {0, 1, 2, 1, 1, 0, 0...}

    长度是4,所以让我们看看我们可以直接长度为4次。答案是1*2*1*1。我们可以连续多长时间3次? 1*2*1 + 2*1*1

    如果要扩展一般用途,唯一需要改变的是打印。不需要三个if,而是需要一个循环,它可以循环接受的每个直线长度和每张起始卡。

    for (int l = length; l > minLength; l--) {
        int amount = 1;
        for (int m = 0; m < length - l + 1; m++) { //there might be by 1 mistake
            amount *= filter[j - m - 1];
        }
        for (int m = 0; m < amount; m++) {
            System.out.print(l + " ");
        }
        System.out.println();
    }