描述
给定数组 arr ,设长度为 n ,输出 arr 的最长上升子序列。(如果有多个答案,请输出其中 按数值(注:区别于按单个字符的ASCII码值)进行比较的 字典序最小的那个)

方法1:双层循环实现动态规划-超时

import java.util.*;

public class Solution {
/**
* retrun the longest increasing subsequence
* @param arr int整型一维数组 the array
* @return int整型一维数组
*/
public int[] LIS (int[] arr) {
int n = arr.length;
if (n == 0) {
return null;
}
int[] dp = new int[n];
int max = Integer.MAX_VALUE;
int index = -1;
Arrays.fill(dp, 1);
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (arr[j] < arr[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
if (dp[i] >= max) {
index = i;
max = dp[i];
}
}
}
//赋值
int[] res = new int[max];
for (int j = max, i = index; j > 0; i--) {
if (dp[i] == j) {
res[j--] = arr[i];
}
}
return res;
}
}

方法2:动态规划+二分查找,tail数组记录最小的数

import java.util.*;

public class Solution {
/**
* retrun the longest increasing subsequence
* @param arr int整型一维数组 the array
* @return int整型一维数组
*/
public int[] LIS (int[] arr) {
int n = arr.length;
int[] dp = new int[n];
int[] tail = new int[n + 1];
int end = 0;
tail[0] = Integer.MIN_VALUE; //存储对应位置元素的值
for(int i = 0; i < n; i++) {
int num = arr[i];
if(tail[end] < num) {
end++;
tail[end] = num;
dp[i] = end;
} else {
int low = 1, high = end;
while(low <= high) {
int mid = low + ((high - low) >> 1);
if(tail[mid] >= num) {
high = mid - 1;
} else if(tail[mid] < num) {
low = mid + 1;
}
}
tail[low] = num;
dp[i] = low;
}
}
int[] res = new int[end];
int len = end;
for(int i = n - 1; i >= 0; i--) {
if(dp[i] == len) {
res[len - 1] = arr[i];
len--;
}
}
return res;
}
}

方法3:方法2中二分查找使用工具类实现

import java.util.*;

public class Solution {
/**
* retrun the longest increasing subsequence
* @param arr int整型一维数组 the array
* @return int整型一维数组
*/
public int[] LIS (int[] arr) {
int n = arr.length;
int[] dp = new int[n];
int[] tail = new int[n + 1];
int end = 0;
tail[0] = Integer.MIN_VALUE; //存储对应位置元素的值
for(int i = 0; i < n; i++) {
int num = arr[i];
if(tail[end] < num) {
end++;
tail[end] = num;
dp[i] = end;
} else {
int site = Arrays.binarySearch(tail, 1, end, arr[i]);
if(site >= 0) {
continue;
}
int ins = -(site + 1);
tail[ins] = arr[i];
dp[i] = ins;
}
}
int[] res = new int[end];
int len = end;
for(int i = n - 1; i >= 0; i--) {
if(dp[i] == len) {
res[len - 1] = arr[i];
len--;
}
}
return res;
}
}

最新文章

  1. MVCC PostgreSQL实现事务和多版本并发控制的精华
  2. Codeforces Round #252 (Div. 2) B. Valera and Fruits
  3. Android MediaRecorder录制音频
  4. Jquery.KinSlideshow图片轮播插件
  5. Python--类使用
  6. Virtual Studio C++ Version Macro - _MSC_VER
  7. Android studio导入Eclipse项目,和一些错误的解决
  8. CLR Profile解决内存占用过高
  9. 【一天一道LeetCode】#202. Happy Number
  10. c++链表基本操作
  11. 对python3中pathlib库的Path类的使用详解
  12. C++自定义NULLPTR
  13. Java编写串口程序
  14. Java并发编程笔记之ConcurrentHashMap原理探究
  15. uploadify 302 上传图片报错
  16. cmake 常用变量和常用环境变量查表手册---整理 .
  17. [原]linux下将网卡设置为混杂模式
  18. python opencv3 显示一张图片
  19. 韩梦飞沙Android应用集合 想法
  20. JSP中的TAG文件和TLD文件小结

热门文章

  1. centos7.9使用yum方式安装MongoDB 5.x
  2. 第一个Django应用 - 第六部分:静态文件
  3. 获取 Docker 容器的 PID 号
  4. MySQL集群搭建(1)-主备搭建
  5. 配置 jenkins 权限管理
  6. 局域网内搭建CentOS PHP 环境
  7. P1886 滑动窗口 /【模板】单调队列 方法记录
  8. Docker | dockerfile构建centos镜像,以及CMD和ENTRYPOINT的区别
  9. day01-3-界面显示&amp;用户登录&amp;餐桌状态显示
  10. java连接数据库加载驱动到java项目