300. 最长上升子序列

2023-11-09

300. 最长上升子序列

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4.
package com.wangyg.leetcode;

public class Leetcode300 {
    public static void main(String[] args) {
        Solution s = new Solution();
        //输出
        System.out.println(s.lengthOfLIS(new int[]{10, 9, 2, 5, 3, 7, 101, 18}));
    }

    /**
     * 给定一个无序的整数数组,找到其中最长上升子序列的长度。
     * <p>
     * 示例:
     * <p>
     * 输入: [10,9,2,5,3,7,101,18]
     * 输出: 4
     * 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
     * 说明:
     * <p>
     * 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
     * 你算法的时间复杂度应该为 O(n2) 。
     * 进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
     * <p>
     * 维持顺序不变,
     * 最暴力的做法: 从10 开始,然后进行 双层for循环进行遍历,然后重复进行查找,只要符合条件即可, 每个数字都向后找一遍,
     * 然后看最长的子序列, 但是这样会有大量的重复计算,对于每个数字来说,后面的数字都要进行重复的遍历,所以是浪费性能
     * <p>
     * 改进方法: 从末尾进行查找
     * 18: 1
     * 101 : 1
     * 7 :  2 (1->101 / 7-> 18都是2)
     * 3: 3
     * 5: 3
     * 2: 4(2_> 5 / 2->3)
     * 9: 2
     * 10: 2
     * <p>
     * 最终结果: 所有中做大的是  4 ,所以最大的list 是4
     */

    static class Solution {
        /**
         * 方式一: O(n2) 时间复杂度
         *
         * @param nums
         * @return
         */
        public int lengthOfLIS(int[] nums) {
            //获取长度
            int len = nums.length;
            //0 1情况
            if (len < 2) return len;
            int[] record = new int[len + 1];
            record[len - 1] = 1; //最后一个位置
            int ans = -1;
            for(int i = len-2; i>= 0; i--){ //从倒数第二个元素位置开始,进行倒叙计算
                int cur = nums[i];//获取当前值
                int max = 0;
                //内循环,向后进行遍历
                for (int j = i + 1; j < len; j++) {
                    //判断如果cur 比 后面值小  &&  max < record[j]
                    if (cur < nums[j] && max < record[j]) {
                        max = record[j]; // 获取最大的max
                    }
                }
                //当前位置的record[i] = max +1
                record[i] = max+1;
                //比较获取最大值 ,赋值给ans
                if(record[i] > ans) ans = record[i];
            }
            return ans;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

300. 最长上升子序列 的相关文章

  • 使用spacy库出现错误OSError: [E941] Can‘t find model ‘en‘.

    问题 运行代码 TEXT data Field tokenize spacy LABEL data LabelField dtype torch float 报错 OSError E941 Can t find model en It lo
  • 将矩阵&概率画成图

    任何一个矩阵都能画成一个图 更严谨的来说 每个矩阵对应一个加权二分图 所谓图是指点和线的集合 二分是指两种不同的类型 加权是指每条线上都有一个数字标记 上图的三个绿点代表三行 两个红点代表两列 若对应矩阵值非零 则在绿点和红点间画一条线连接
  • PHP中的电子邮件如何发送?

    PHP中的电子邮件发送是一个常见的需求 但是如果你是一个新手 可能会觉得有些棘手 别担心 我可以为你提供一些简单的步骤和代码例子 帮助你发送电子邮件 首先 你需要使用PHP的mail 函数来发送电子邮件 这个函数需要三个参数 邮件地址 邮件
  • 【解决】MFC改变窗口标题“无标题—title”

    用框架窗口类的SetWindowText L 你的标题 在应用程序类CTestApp InitInstance 中调用如下语句 m pMainWnd gt SetWindowText L 你的标题 或者在其他地方用AfxGetMainWnd

随机推荐

  • 图的m着色问题-回溯法

    排列树问题 给定无向连通图G和m种不同的颜色 用这些颜色为图G的各顶点着色 每个顶点着一种颜色 是否有一种着色法使G中任意相邻的2个顶点着不同颜色 输出结果 include
  • 2023年云南省职业院校技能大赛中职组“网络安全”赛项样题

    2023年云南省职业院校技能大赛 中职组 网络安全 赛项样题 一 竞赛时间 总计 180分钟 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A B模块 A 1 登录安全加固 180分钟 200分 A 2 数据库加固 A 3 服
  • OpenGL: 平面阴影投射矩阵的推导

    OpenGL 平面阴影投射矩阵的推导 OpenGL SuperBible 这本书介绍了一种阴影的实现方法 将模型视图矩阵压平 所有被绘制的物体都将位于这个平面的二维世界中 不过这本书没有介绍该平面阴影投射矩阵是如何推导的 假设平面方程 Ax
  • linux脚本调用db2存储过程,LINUX定时执行含有DB2存储过程的SHELL脚本

    LINUX定时执行含有DB2存储过程的SHELL脚本 由会员分享 可在线阅读 更多相关 LINUX定时执行含有DB2存储过程的SHELL脚本 6页珍藏版 请在人人文库网上搜索 1 LINUX下定时执行含有DB2存储过程的SHELL脚本最近项
  • 开关电源纹波的产生、测量和抑制

    一 产生分析 1 随着SWITCH 的开关 电感L 中的电流也是在输出电流的有效值上下波动的 所以在输出端也会出现一个与SWITCH 同频率的纹波 一般所说的纹波就是指这个 它与输出电容的容量和ESR 有关系 这个纹波的频率与开关电源相同
  • Windows 下 sublime text3的安装及设置

    一 安装Sublime Text3 1 下载 官网下载 http www sublimetext com 3 百度云 https pan baidu com s 1X6hD7AH giyahkCK79ZKqw 提取码 e3ai 2 安装 S
  • android recovery 升级和分区

    1 华为手机分区信息 1 shell android df df Filesystem Size Used Free Blksize dev 196M 64K 196M 4096 mnt asec 196M 0K 196M 4096 mnt
  • DBCP连接池配置参数说明

  • 【注意】C++基类的构造函数中,参数与类中已有变量同名,要加上作用域来表示类内变量

    定义一个类 class Text1 public Text1 构造函数 Text1 int pub int pri int pro 重载的构造函数 Text1 int pub void OutputValue 打印类内变量 private
  • java实现一台电脑控制多台手机_涨姿势:教你用电脑远程控制多台手机!终于可以挂手机了!...

    是不是每次坐到电脑前 你的桌面上总会摆好手机 时不时低头瞅瞅 不管是看视频 资讯都会时不时摆弄两下手机 如果你是上班族 是不是因为这个被领导骂过或者斜眼过 好吧 难道你不感觉这样很烦么 小编今天就介绍一个方法让你能用电脑挂手机 关键是过程超
  • iOS死灰复燃SDK

    iOS死灰复燃SDK功能 令iOS APP进入后台或手机锁屏下常也能常驻后台活动 定位 即使杀死APP进程也会适时自动复活APP 让APP能够在后台或进程被杀死之后也能照常发送网络请求 定位 更新数据等操作 具备自动复活功能 SDK版本 V
  • 华为OD机试真题- 找数字【2023Q2】【JAVA、Python、C++】

    题目描述 给一个二维数组nums 对于每一个元素num i 找出距离最近的且值相等的元素 输出横纵坐标差值的绝对值之和 如果没有等值元素 则输出 1 例如 输入数组nums为 0 3 5 4 2 2 5 7 8 3 2 5 4 2 4 对于
  • 2023待学习&待填的坑

    代码cherry pick时解决代码冲突 一 gdb调试 二 git教程实践部分 done 20230805 学习笔记链接 git相关 张杰萌萌哒的博客 CSDN博客 三 编译原理及makefile编写 四 C 课程 60 学习笔记链接 C
  • TOB企业如何借助生态力,实现可持续增长

    近年来 随着经济社会的高速发展 数字化转型已成为企业高质量发展 必答题 企业开始通过购买产品 解决方案或者自研的方式来进行本企业的数字化建设 但是由于内部部门墙或者是系统之间的隔阂 难以做到以整个公司为视角的全面数字化建设 就容易在企业内部
  • 分布式ID生成方案

    分布式ID生成方案 在业务系统中很多场景下需要生成不重复的 ID 比如订单编号 支付流水单号 优惠券编号等都需要使用到 在我们业务数据量不大的时候 单库单表完全可以支撑现有业务 数据再大一点搞个MySQL主从同步读写分离也能对付 但随着数据
  • JAVA环境变量path配置及其作用

    1 环境变量的作用是为了在dos的任意目录 可以去使用Java和javac 命令 2 先配置JAVA HOME 指向jdk安装的主目录 3 编辑path环境变量 增加 JAVA HOME bin 其中 代表引用 这样写的好处就是将来的jdk
  • springboot WxJava 收发企业微信 应用消息

    在Spring Boot中 同样可以使用WxJava来实现企业微信应用消息的收发功能 WxJava是一款基于微信公众号 小程序 企业号的Java SDK 提供了丰富的功能 包括消息收发 菜单管理 用户管理等 以下是简单的WxJava实现企业
  • HTML加js实现计算文件哈希值,前端使用js计算文件的MD5值

    在前端开发时有时需要计算文件的 MD5 值传给后端用作比较文件的准确性和完整性 还应用到了现代浏览器中都实现了的类 FileReader 它的实例的 readAsBinaryString 方法 用来读取文件的原始二进制数据 创建HTML部分
  • eclipse的下载及安装

    目录 1 eclipse的下载 2 2 eclipse的安装 4 1 eclipse的下载 eclipse官网地址 https www eclipse org 进入eclipse官网选择Download 选择Download Package
  • 300. 最长上升子序列

    300 最长上升子序列 给定一个无序的整数数组 找到其中最长上升子序列的长度 示例 输入 10 9 2 5 3 7 101 18 输出 4 解释 最长的上升子序列是 2 3 7 101 它的长度是 4 package com wangyg