给出一个数组,找出最少的元素,使得将其删除之后,剩下的元素使递增有序的。
解析:
删除最少的元素,保证剩下的元素使递增有序的。换一句话说,找出最长的递增有序序列。
找出最长递增有序序列有多种方法。在这里,我们除了需要额外一维数组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; } }