最長遞增子序列-Java 實現

小北的部落格發表於2018-03-06

1、Θ(n2) 打表實現

初始化對角線為 1;
對每一個 i,遍歷 j(0 到 i-1):
若A[i] <= A[j],置 1。
若A[i] > A[j],取第 j 行的最大值加 1。

private static int  getLargestLen(int[] array) {
    int[] max = new int[array.length];
    for (int i = 0; i <array.length ; i++) {
        max[i] = 1;
    }

    for (int i = 1; i < array.length ; i++) {
        for (int j = 0; j < i ; j++) {
            if (array[i] > array[j] && max[i] < max[j] + 1) {
                max[i] = max[j] + 1;
            }
        }
    }
    int maxLen = 0;
    for (int i = 0; i < array.length ; i++) {
        if (maxLen < max[i]) {
            maxLen = max[i];
        }
    }
    return maxLen;
}

2、Θ(nlgn)的方案

建立一個輔助陣列array,依次讀取陣列元素 x 與陣列末尾元素 top比較:
如果 x > top,將 x 放到陣列末尾;
如果 x < top,則二分查詢陣列中第一個 大於等於x 的數,並用 x 替換它。

private static int getLength(int[] array) {
    int[] assistArray = new int[array.length];
    assistArray[0] = array[0];
    int length = 0;
    for (int number : array) {
        if (assistArray[length] < number) {
            assistArray[++length] = number;
        } else {
            int low = 0;
            int high = length;
            while (low < high) {
                int middle = (low + high) >> 1;
                if (assistArray[middle] < number) {
                    low = middle + 1;
                } else {
                    high = middle - 1;
                }
            }
            if (assistArray[low] < number && (low + 1) < assistArray.length) {
                assistArray[low + 1] = number;
            } else {
                assistArray[low] = number;
            }
        }
    }
    for (int tmp : assistArray) {
        System.out.println(tmp);
    }
    return length + 1;
}

相關文章