Java求给定数组的最长递增子序列
来源:互联网 发布:android电视直播软件 编辑:程序博客网 时间:2024/06/05 05:37
最近一直在讨论的求解最长递增子序列问题(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); }}
阅读全文
0 0
- Java求给定数组的最长递增子序列
- 求数组的最长递增子序列
- 求数组的最长递增子序列
- 给定一个整数数组,求它的一个最长递增子序列。
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中的最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- springMVC的url-pattern
- Java反射机制详解
- Linux常用命令手册
- C
- ubuntu下面 将桌面换成 英文
- Java求给定数组的最长递增子序列
- 数据库隔离级别---MySQL的默认隔离级别就是Repeatable,Oracle默认Read committed,最高级别Serializable
- shared_ptr简单实现
- 【c】三子棋
- Count
- vs文件路径问题
- Linux服务器上监控网络带宽的18个常用命令
- JDBC oracle thin 连接方式
- iptables:tproxy做透明代理