最长递增子序列
来源:互联网 发布:英雄传奇刷点卷软件 编辑:程序博客网 时间:2024/06/09 14:51
题目
求一个数组中最长递增子序列,要求时间复杂度尽量低。
- 测试输入
7
2 1 4 3 1 5 6 - 测试输出
4
分析1
采取从后向前的分析思路。如果已知第
[2 1 4 3 1 5 6]
每一步分析如下: 可以看到数组
代码2
import java.util.Scanner;public class LIS { static int solution2(int[] array, int[] tail) { int n = array.length; tail[0] = array[0]; int maxLen = 1; for (int i = 1; i < n; i++) { if (array[i] > tail[maxLen - 1]) { tail[maxLen] = array[i]; ++maxLen; } else {// 线性查找 for (int k = 0; k < maxLen; k++) { if (tail[k] >= array[i]) { tail[k] = array[i]; break; } } } } return maxLen; } static int solution3(int[] array, int[] tail) { int n = array.length; tail[0] = array[0]; int maxLen = 1; for (int i = 1; i < n; i++) { if (array[i] > tail[maxLen - 1]) { tail[maxLen] = array[i]; ++maxLen; } else {// 二分查找 int pos = binarySearch(tail, maxLen, array[i]); tail[pos] = array[i]; } } return maxLen; } static int binarySearch(int[] array, int limit, int value) { int start = 0; int end = limit - 1; while (start <= end) { int mid = start + (end - start) / 2; if (array[mid] == value) { return mid; } else if (array[mid] < value) { start = mid + 1; } else { end = mid - 1; } } return start; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] array = new int[n]; for (int i = 0; i < n; i++) { array[i] = sc.nextInt(); } int[] tail = new int[n]; System.out.println(solution2(array, tail)); }}
0 0
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 最长递增子序列
- 硬链接和软连接
- 训练营第七 -- 十天学习笔记
- Servlet过滤器
- socket编程入门(三)
- 数据结构(C语言)学习之路——算法
- 最长递增子序列
- 宅急送 项目第五天 区域、分区、定区
- java8:lambda表达式强化练习
- CentOS 6.5通过命令行安装发送邮件
- Halcon实例教程之金属表面划痕及裂缝检测
- HashMap源码阅读笔记
- 集合框架-Arrays工具类的asList()方法(把数组转成集合)
- Leet Code OJ 8. String to Integer (atoi) [Difficulty: Easy]
- git入门----repo的基本认识