求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}。
2017-01-13 19:47
351 查看
int binaryFind(int* lis, int target, int end) { int low = 0; int high = end; while (low <= high) { int mid = (low + high) / 2; if (target < lis[mid]) { low = mid + 1; } else { high = mid - 1; } } return low; } int* findLongestSubquence(int* arr, int len, int &maxLen) { if (!arr || len == 0) { return NULL; } //0~i元素递减排序 int* lis = new int[len]; //记录i元素结尾的递减子序列长度 int* lds = new int[len]; memset(lis, 0, sizeof(int) * len); memset(lds, 0, sizeof(int) * len); maxLen = 1; lis[0] = arr[0]; lds[0] = 1; for (int i = 1; i < len; ++i) { //递减的二分查找 int pos = binaryFind(lis, arr[i], maxLen - 1); lis[pos] = arr[i]; //以该元素结尾的最长递减序列的长度 lds[i] = pos + 1; if (pos >= maxLen) { maxLen++; } } int curLen = maxLen; //还原最长递减子序列 for (int i = len - 1; i >= 0; --i) { if (lds[i] == curLen) { lis[curLen - 1] = arr[i]; curLen--; if (curLen == 0) { break; } } } return lis; }
相关文章推荐
- 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
- 【编程题目】求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5, 4,3,2}
- 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
- 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
- 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}。
- 算法习题47:求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
- 求一个数组的最长递减子序列比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5, 4,3,2}
- 数据结构——算法之(025)( 求一个数组的最长递减子序列)
- 求一个数组的最长递减子序列
- 算法 - 求一个数组的最长递减子序列(C++)
- 求一个数组的最长递减子序列
- 算法 - 求一个数组的最长递减子序列(C++)
- 求一个数组的最长递减子序列
- 计蒜客 难题题库 142 求数组的最长递减子序列
- 给定一个长度为N的数组,找出一个最长的单调自增子序列
- 获取一个数组中最长的连续的元素序列
- 一个无序整数数组中找到最长连续序列(Longest Consecutive Sequence)和两个元素使得相差最小
- 求数组的最长递减子序列
- (Relax 后缀数组1.2)POJ 3261 Milk Patterns(求一个长度为n的整数序列中,至少出现k次的子序列的最长的长度)
- 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱). 第二解