zoukankan      html  css  js  c++  java
  • 最长递增子序列

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

    解析

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

    找出最长递增有序序列有多种方法。在这里,我们除了需要额外一维数组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;
        }
    }
  • 相关阅读:
    组合算法实现
    Memcached 和 Redis 分布式锁方案
    CLR 内存分配和垃圾收集 GC
    Windbg 的使用和常用命令
    Geohash 算法学习
    经纬度计算
    Windbg 分析CPU上涨
    Windbg 分析内存上涨
    django基于存储在前端的token用户认证
    非常详细的Django使用Token(转)
  • 原文地址:https://www.cnblogs.com/ChanSS/p/6715652.html
Copyright © 2011-2022 走看看