Java求给定数组的最长递增子序列
2017-08-22 16:16
232 查看
最近一直在讨论的求解最长递增子序列问题(LIS)
参考了很多求解方法,在此记录以下代码实现,后续发现更优方法再更新
代码实现:
以上代码返回最长递增子序列的长度,若需要返回最长的递增子序列,代码实现如下:
参考了很多求解方法,在此记录以下代码实现,后续发现更优方法再更新
代码实现:
public int LIS(int[] a ){ int[] arr=new int[a.length];//用于记录当前个元素作为最大元素的最长递增序列的长度 for (int i = 0; i < a.length; i++) { //初始化 arr[i]=1; } int max=1; for (int i = 1; i < a.length; i++) { for (int j = 0; j <i; j++) { if (a[j]<a[i]&&(arr[j]+1)>arr[i]) { arr[i]=arr[j]+1; } if (max<arr[i]) { //得到当前最长递增序列的长度以及该子序列的最末元素的位置 max=arr[i]; } } } return max; }
以上代码返回最长递增子序列的长度,若需要返回最长的递增子序列,代码实现如下:
public ArrayList<Integer> maxSubIncreaseArray(int[] array){ int[] list = new int[array.length]; ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> tmp = new ArrayList<Integer>(); int index = -1;//用于标记当前元素之前的第一个递增子序列的位置 int maxIndex = 0;//用于标记该序列的最长递增子序列的位置 int max = Integer.MIN_VALUE;//最长递增子序列的长度 list[0] = 1;//该列表用于标记包括当前元素在内的前半部分的最长递增子序列的长度 tmp.add(array[0]); res.add(tmp); for(int i=1;i<array.length;i++){ index = -1; tmp = new ArrayList<Integer>(); for(int j=0;j<i;j++){ if(array[j]<array[i]&&list[j]>list[i]){ list[i] = list[j]; index = j; } } ++list[i]; if(index>-1) tmp.addAll(res.get(index)); tmp.add(array[i]); res.add(tmp); if(list[i]>max){ max = list[i]; maxIndex = i; } } return res.get(maxIndex); } }
相关文章推荐
- 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱). 第二解
- 面试题:给定一个数组,数组中只包含0和1。请找到一个最长的子序列,其中0和1的数量是相同的
- 【DP】计算一个数组的最长递增子序列
- 无序数组的最长递增子序列
- 算法题-数组的最长递增子序列
- 求数组的最长递增子序列的长度
- 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).
- 【Codeforces Round 333 (Div 2)B】【贪心 多指针】Approximating a Constant Range 给定数组 相邻元素波动为1 求差值不超1的最长序连续子序列
- 数组中最长递增子序列-java
- 求数组的最长递增子序列VS吉哥系列故事——完美队形
- 求数组的最长递增子序列
- 获取一个数组中最长的连续的元素序列。例如,给定了[31,6,32,1,3,2],最长的连续的元素序列是[1,2,3],返回其长度3
- 给定一个长度为N的数组,找出一个最长的单调自增子序列
- 求数组的最长递增子序列
- 最长递增子序列 动态规划 java代码
- 最长递增子序列-Java 实现
- 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现
- poj 1080(sum初始化&数组下标i&最长公共自序列类型)
- NYOJ 17 (最长单调递增子序列) O (n*n) + O(n*lgn)
- java 实现后缀数组及最长回文子串问题