最长递增子序列

给出一个数组,找出最少的元素,使得将其删除之后,剩下的元素使递增有序的。

解析

删除最少的元素,保证剩下的元素使递增有序的。换一句话说,找出最长的递增有序序列。

找出最长递增有序序列有多种方法。在这里,我们除了需要额外一维数组dp记录以及每个元素为结尾的最长子序列的长度以外,还需要一个哈希表,用来保存在最长子序列的元素。dp[i]代表以输入数组A[i]为结尾的最长子序列长度,dp[i]通过如下方式计算:

最后,通过回朔哈希表的方法,把需要删除的元素剔除

import java.util.ArrayList;
import java.util.HashMap;

/**
 * 最长递增子序列
 * 给出一个数组,找出最少元素,使得将其删除后,剩下的元素是递增有序的
 * @author Administrator
 *
 */
public class LongestIncrease {
    
    public static void main(String[] args) {
        int[] arr =new int[]{1,2,3,1,1,4,5,6};
        ArrayList<Integer> list =minDelete(arr);
        for (Integer integer : list) {
            System.out.print(integer+" ");
        }
    }
    
    public static ArrayList<Integer> minDelete(int[] A){
        ArrayList<Integer> res = new ArrayList<Integer>();     //存储要删除的元素
        HashMap<Integer, Integer> bt = new HashMap<Integer, Integer>();
        int[] dp = new int[A.length];  //记录每个元素为结尾的最长子序列长度
        int maxCount = 0;
        int end = 0;       //记录最长递增子序列的最后一个元素位置
        for(int i=0;i<A.length;i++){
            dp[i] = 1;
            for(int j=0;j<i;j++){
                if(A[i]>A[j]){
                    dp[i] = Math.max(dp[i], dp[j]+1);
                    if(maxCount<dp[i]){
                        maxCount = dp[i];
                        bt.put(i, j);
                        end = i;
                    }
                }
            }
        }
        for(Integer in: bt.keySet()){
            System.out.println(in+" " +bt.get(in));
        }
        int k = A.length-1;
        while(k>=0){
            while(k>end){res.add(A[k]);k--;}
            k--;
            if(bt.containsKey(end)){
                end = bt.get(end);
            }else end = -1;
        }
        return res;
    }
}

 

posted @ 2017-04-15 21:09  众里寻他壹贰度  阅读(323)  评论(0编辑  收藏  举报