最长递增数组

来源:互联网 发布:软件下载免费 编辑:程序博客网 时间:2024/05/16 15:34

最长递增数组

问题描述如下:
【题目】 给定数组arr,返回arr的最长递增子序列。
【举例】arr=[2,1,5,3,6,4,8,9,7],返回的最长递增子序列为[1,3,4,8,9]。
【要求】如果arr长度为N,请实现时间复杂度为O(N*logN)的方法。

public int[] getLongestIncreasingSeq(int[] array) {        if (array == null || array.length == 0)            return null;        int[] dp = getDpArray(array);        return generateResult(array,dp);    }    /**     * @param array     * @param dp     * @return     */    private int[] generateResult(int[] array, int[] dp) {        int index = 0;        int length = 0;        for(int i = 0;i<array.length;i++){            if(dp[i]>length){                length = dp[i];                index = i;            }        }        int[] result = new int[length];        result[--length] = array[index];        for(int i = index ;i>=0;i-- ){            if(array[i]<array[index] && dp[i] == dp[index] -1){                result[--length] = array[i];                index = i;            }        }        return result;    }    /**     * 生成dp数组     * dp[i]表示数组0~i位置中最长递增序列的长度     * @param array     * @return     */    private int[] getDpArray(int[] array) {        int[] dp = new int[array.length];        //ends[i]表示最长递增序列长度为i+1的序列末尾的最小值        int[] ends = new int[array.length];        ends[0] = 0;        dp[0] = 1;        int low = 0;        int high = 0;        int rightBoundary = 0;//数组右边界,为0表示数组为空        int mid = 0;        for (int i = 0; i < array.length; i++) {            low = 0;            high = rightBoundary;            //二分查找ends数组中第一个比array[i]大的值            while (low <= high) {                mid = (low + high) / 2;                if (array[i] > array[mid]) {                    low = mid + 1;                } else {                    high = mid - 1;                }            }            rightBoundary = Math.max(rightBoundary, low);            //更新ends[low]的值            ends[low] = array[i];            //设置dp[i]为low+1;            dp[i] = low + 1;        }        return dp;    }
0 0
原创粉丝点击