最长递增数组
来源:互联网 发布:软件下载免费 编辑:程序博客网 时间:2024/05/16 15:34
最长递增数组
问题描述如下:
【题目】 给定数组arr,返回arr的最长递增子序列。
【举例】arr=[2,1,5,3,6,4,8,9,7],返回的最长递增子序列为[1,3,4,8,9]。
【要求】如果arr长度为N,请实现时间复杂度为O(N*logN)的方法。
public int[] getLongestIncreasingSeq(int[] array) { if (array == null || array.length == 0) return null; int[] dp = getDpArray(array); return generateResult(array,dp); } /** * @param array * @param dp * @return */ private int[] generateResult(int[] array, int[] dp) { int index = 0; int length = 0; for(int i = 0;i<array.length;i++){ if(dp[i]>length){ length = dp[i]; index = i; } } int[] result = new int[length]; result[--length] = array[index]; for(int i = index ;i>=0;i-- ){ if(array[i]<array[index] && dp[i] == dp[index] -1){ result[--length] = array[i]; index = i; } } return result; } /** * 生成dp数组 * dp[i]表示数组0~i位置中最长递增序列的长度 * @param array * @return */ private int[] getDpArray(int[] array) { int[] dp = new int[array.length]; //ends[i]表示最长递增序列长度为i+1的序列末尾的最小值 int[] ends = new int[array.length]; ends[0] = 0; dp[0] = 1; int low = 0; int high = 0; int rightBoundary = 0;//数组右边界,为0表示数组为空 int mid = 0; for (int i = 0; i < array.length; i++) { low = 0; high = rightBoundary; //二分查找ends数组中第一个比array[i]大的值 while (low <= high) { mid = (low + high) / 2; if (array[i] > array[mid]) { low = mid + 1; } else { high = mid - 1; } } rightBoundary = Math.max(rightBoundary, low); //更新ends[low]的值 ends[low] = array[i]; //设置dp[i]为low+1; dp[i] = low + 1; } return dp; }
0 0
- 数组最长递增序列
- 最长递增数组
- 数组最长递增子序列
- 数组最长递增子序列
- 数组最长递增子序列
- 数组最长递增子序列
- 数组最长递增子序列
- 求数组中最长递增子序列
- 数组中最长递增子序列-java
- 求数组中最长递增子序列
- 数组中最长递增子序列
- 求解数组中最长递增自序列
- 求数组中的最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- 数组中最长递增子序列
- 求数组中最长递增子序列
- 求数组中最长递增子序列
- Python os-操作系统接口
- PE文件详解之块表
- struts基本原理
- Java基础笔记之三 语句float num=3.1415926是否正确
- uva 11019 Matrix Matcher (ac自动机二维匹配)
- 最长递增数组
- 新人请多指教,自我介绍
- "Python"学习笔记(二)
- HDU 2899 牛顿迭代
- hdu4085 斯坦纳森林
- C中的volatile用法
- CentOS执行SU时 Authentication failure
- Objective-C 【Category-非正式协议-延展】
- 中兴2015机试题---IP地址的划分与合并