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

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

  1. import java.util.*;
  2.  
  3. public class Solution {
  4. /**
  5. * retrun the longest increasing subsequence
  6. * @param arr int整型一维数组 the array
  7. * @return int整型一维数组
  8. */
  9. public int[] LIS (int[] arr) {
  10. int n = arr.length;
  11. if (n == 0) {
  12. return null;
  13. }
  14. int[] dp = new int[n];
  15. int max = Integer.MAX_VALUE;
  16. int index = -1;
  17. Arrays.fill(dp, 1);
  18. for (int i = 1; i < n; i++) {
  19. for (int j = 0; j < i; j++) {
  20. if (arr[j] < arr[i]) {
  21. dp[i] = Math.max(dp[i], dp[j] + 1);
  22. }
  23. if (dp[i] >= max) {
  24. index = i;
  25. max = dp[i];
  26. }
  27. }
  28. }
  29. //赋值
  30. int[] res = new int[max];
  31. for (int j = max, i = index; j > 0; i--) {
  32. if (dp[i] == j) {
  33. res[j--] = arr[i];
  34. }
  35. }
  36. return res;
  37. }
  38. }

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

  1. import java.util.*;
  2.  
  3. public class Solution {
  4. /**
  5. * retrun the longest increasing subsequence
  6. * @param arr int整型一维数组 the array
  7. * @return int整型一维数组
  8. */
  9. public int[] LIS (int[] arr) {
  10. int n = arr.length;
  11. int[] dp = new int[n];
  12. int[] tail = new int[n + 1];
  13. int end = 0;
  14. tail[0] = Integer.MIN_VALUE; //存储对应位置元素的值
  15. for(int i = 0; i < n; i++) {
  16. int num = arr[i];
  17. if(tail[end] < num) {
  18. end++;
  19. tail[end] = num;
  20. dp[i] = end;
  21. } else {
  22. int low = 1, high = end;
  23. while(low <= high) {
  24. int mid = low + ((high - low) >> 1);
  25. if(tail[mid] >= num) {
  26. high = mid - 1;
  27. } else if(tail[mid] < num) {
  28. low = mid + 1;
  29. }
  30. }
  31. tail[low] = num;
  32. dp[i] = low;
  33. }
  34. }
  35. int[] res = new int[end];
  36. int len = end;
  37. for(int i = n - 1; i >= 0; i--) {
  38. if(dp[i] == len) {
  39. res[len - 1] = arr[i];
  40. len--;
  41. }
  42. }
  43. return res;
  44. }
  45. }

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

  1. import java.util.*;
  2.  
  3. public class Solution {
  4. /**
  5. * retrun the longest increasing subsequence
  6. * @param arr int整型一维数组 the array
  7. * @return int整型一维数组
  8. */
  9. public int[] LIS (int[] arr) {
  10. int n = arr.length;
  11. int[] dp = new int[n];
  12. int[] tail = new int[n + 1];
  13. int end = 0;
  14. tail[0] = Integer.MIN_VALUE; //存储对应位置元素的值
  15. for(int i = 0; i < n; i++) {
  16. int num = arr[i];
  17. if(tail[end] < num) {
  18. end++;
  19. tail[end] = num;
  20. dp[i] = end;
  21. } else {
  22. int site = Arrays.binarySearch(tail, 1, end, arr[i]);
  23. if(site >= 0) {
  24. continue;
  25. }
  26. int ins = -(site + 1);
  27. tail[ins] = arr[i];
  28. dp[i] = ins;
  29. }
  30. }
  31. int[] res = new int[end];
  32. int len = end;
  33. for(int i = n - 1; i >= 0; i--) {
  34. if(dp[i] == len) {
  35. res[len - 1] = arr[i];
  36. len--;
  37. }
  38. }
  39. return res;
  40. }
  41. }

【每日一题】【动态规划&二分】2022年2月9日-NC91 最长上升子序列(三)的更多相关文章

  1. 2022年5月11日,NBMiner发布了41.3版本,在内核中加入了100%LHR解锁器,从此NVIDIA的显卡再无锁卡一说

           2022年5月11日,NBMiner发布NBMiner_41.3版本,主要提升了稳定性.         2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核 ...

  2. 关于2022年3月9日之后Typora登录不了--已解决

    p.s.今天是2022.7.27,软件版本:13.6.1 (以下所有方法,亲自尝试后整理出的) 报错信息: This beta version of typora is expired, please ...

  3. .NET Conf 2022 &ndash; 11 月 8 日至 10 日

    .NET Conf 2022 下周就正式开启了,时间是美国时间的 11月8日至10日..NET Conf 2022是一个免费的,为期三天的, 虚拟开发人员活动提供多种实时会话,其中包括来自社区和 .N ...

  4. caioj 1072 动态规划入门(二维一边推5:最长公共子序列 LCSS加强版)

    在51nod刷到过同样的题,直接秒杀 见https://blog.csdn.net/qq_34416123/article/details/81697683 #include<cstdio> ...

  5. ccf题库中2016年4月2日俄罗斯方块问题

    题目如下: 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏. 游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块.每一轮,都会有一个新 ...

  6. Java数组-2022年4月17日

    目录 数组 数组Array 数组的常见异常 数组的遍历 数组的扩容 数组类型的返回值 可变长数组 排序算法 二维数组 测试代码 数组 数组Array ArrayList概念:一个连续的空间,存储多个相 ...

  7. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  8. 【剑指Offer】简单部分每日五题 - Day 1

    今天开始更新leetcode上<剑指Offer>的题解,先从简单难度开始.预计按下列顺序更新: 简单难度:每日5题 中等难度:每日3题 困难难度:每日1题 17 - 打印从1到最大的n位数 ...

  9. c++刷题(6/100)最长上升子序列

    题目一:区间子数组个数 给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = ...

  10. C++动态规划实现查找最长公共子序列

    问题描述: 给定两个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列.(给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共 ...

随机推荐

  1. Prometheus样本采集器汇总

    系统基本信息 Linux Servers: Exporter https://github.com/prometheus/node_exporter Dashboard https://grafana ...

  2. 使用Prometheus和Grafana监控emqx集群

    以 Prometheus为例: emqx_prometheus 支持将数据推送至 Pushgateway 中,然后再由 Promethues Server 拉取进行存储. 注意:emqx_promet ...

  3. Solutions:Elastic SIEM - 适用于家庭和企业的安全防护 ( 三)

  4. 使用shell脚本定时重启tomcat服务

    #!/bin/bash DATE=`date +%Y-%m-%d-%H-%M-%S` echo "当前时间是:$DATE" # 根据端口号查找进程 PID=`/usr/sbin/l ...

  5. CentOS7.X yum安装MySQL8.0 数据表不区分大小写切换默认存储路径

    查看当前系统版本的详细信息 # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) yum源下载 地址:https://dev.m ...

  6. vue基础之MV*和它们之间的不同

    vue中的设计思想 vue中的设计思想主要是MV*模式,由最早的MVC(model-view-controller)框架,到后面的MVP(model-view-presenter),甚至到最后的MVV ...

  7. Spring boot定义多个配置文件并自由切换

    在resource目录下定义三个配置文件 (properties文件已被我注销,配置文件建议用yml,如果properties文件与yml文件同时存在,SpringBoot会优选加载propertie ...

  8. 用golang开发系统软件的一些细节

    用golang开发系统软件的一些细节 作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 (本文的pdf版本) ...

  9. python解释器下载及注意事项

    python解释器 python解释器下载 python解释器下载官网:https://www.python.org/downloads/windows/ 目前比较常用的python版本有python ...

  10. HDU3001 Travelling (状压DP)

    题目没有起点限制,且每个节点至少访问1次,最多访问2次,所以用三进制数表示节点的状态(选取情况). 因为三进制数的每一位是0或1或2,所以预处理z状态S的第j位的数是有必要的. 边界条件:dp[tri ...