【经典面试题目:最长递增子序列变形题目 | 动态规划 + 二分】

news2024/12/29 10:01:25

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚗 知识回顾
    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 动态规划 + 二分查找
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚗 知识回顾

大家再看这道题目之前,可以先去看一下我之前写过的一篇关于最长递增子序列算法题的博客,再看这个题目就更容易理解了。
博客的地址放到这里了,可以先去学习一下这到题目。

  • 【LeetCode: 300. 最长递增子序列 | 暴力递归=>记忆化搜索=>动态规划】

🚩 题目链接

  • 牛客网:最长上升子序列(三)

⛲ 题目描述

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

数据范围:
0≤n≤200000,0≤arr[i]≤1000000000
要求:空间复杂度 O(n),时间复杂度 O(nlogn)

输入:
[1,2,8,6,4]

返回值:
[1,2,4]

说明:
其最长递增子序列有3个,(1,2,8)、(1,2,6)、(1,2,4)其中第三个 按数值进行比较的字典序 最小,故答案为(1,2,4)

🌟 求解思路&实现代码&运行结果


⚡ 动态规划 + 二分查找

🥦 求解思路

  1. 核心的求解思路我们之前都讲过了,此处就不做过多的讲解了,如果还有问题的同学可以看一下我之前的文章先进行学习,否则还是比较难理解的。
    【LeetCode: 300. 最长递增子序列 | 暴力递归=>记忆化搜索=>动态规划】
  2. 那我们就着重来看一下该题想让我们求解什么?其实题目都告诉我们了,收集最长递增子序列结果的答案数组。
  3. 该题难在哪里?该题难就难在题目必须让我们通过动态规划+二分优化来求解,因为题目给定的数据量很大,如果不使用二分进行优化的话是通过不了的。
  4. 该题目怎么实现呢?1.原来基础的思路上再维护一个数组,用来表示以某一个位置结尾的最长递增子序列的长度;2.为保证字典序最小,从后开始向前遍历进行收集答案的过程。
  5. 有了基本的思路+前面题目的讲解,我们再来看这道题目就会感觉非常容易了,接下来我们一起来看具体代码的实现过程。

🥦 实现代码

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;
        // dp 数组中存储的是单调递增的元素
        int[] dp=new int[n];
        int cnt=0;
        // len 数组表示以i位置结尾的最长递增子序列的长度
        int[] len=new int[n];
        for(int i=0;i<n;i++){
            int x=arr[i];
            int left=-1,right=cnt;
            while(left+1<right){
                int mid=(left+right)>>1;
                if(dp[mid]<x){
                    left=mid;  
                }else{
                    right=mid;
                }
            }
            dp[right]=x;
            // 记录当前i位置下标最长递增子序列的长度   长度要加1,下标从0开始
            len[i]=right+1;
            if(right==cnt) cnt++;
        }
        // 收集答案
        int[] ans=new int[cnt];
        for(int i=n-1;i>=0;i--){
            if(len[i]==cnt){
                ans[--cnt]=arr[i];
            }
        }
        return ans;
    }
}

🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/442764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

StackExchange.Redis.RedisServerException 针对持有错误类型值的密钥的WRONGTYPE操作

Redis 的异常消息&#xff1a;StackExchange.Redis.RedisServerException:“WRONGTYPE Operation against a key holding the wrong kind of value” 最近一个较早的项目新增一些功能&#xff0c;业务中服务端需要在token中自动获取用户相关信息的操作&#xff0c;项目中已经封…

web模块_2(SQL注入,上传文件的权限获取)

1题目描述&#xff1a;你知道index.php的备份文件名吗&#xff1f; index.php的备份文件名为index.php.bak2题目描述 php中&#xff0c;双等号是弱类型比较。判断是否相等&#xff0c;不判断格式。 判断格式是否相等。“0a”0为True&#xff0c;“1235a"不算数字&#xf…

从原理聊JVM(一):染色标记和垃圾回收算法

作者&#xff1a;京东科技 康志兴 1 JVM运行时内存划分 1.1 运行时数据区域 • 方法区 属于共享内存区域&#xff0c;存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池&#xff0c;属于方法区的一部分&#xff0c;用于存放编译期生…

spring的BeanFactory和applicationContext有什么区别?

一、加载bean时机不同 ApplicationContext是一次性立刻加载,比较消耗资源但是后续读取非常快,会将spring中所有的bean进行初始化,全部实例化到spring中!!属于饿汉模式加载。 Beanfactory是一个用来管理bean对象的工厂&#xff0c;加载bean的时候不会立刻一次性加载,使用的是惰性…

【C语言】分支语句和循环语句(下)

【C语言】分支语句和循环语句&#xff08;下&#xff09; 1.for循环1.2 语法1.3 break和continue在for循环中1.4 for语句的循环控制变量1.5 一些for循环的变种1.6一道笔试题 2. do……while&#xff08;&#xff09;循环2.1 do语句的语法2.2 do语句的特点2.3 do while循环中的b…

Python多线程慎用shutil.make_archive打包

Python多线程慎用shutil.make_archive打包 记一下在工作中遇到一个错误&#xff0c;先说一下结论shutil.make_archive是线程不安全的&#xff0c;要慎重使用&#xff01;&#xff01;&#xff01; 参考&#xff1a;https://stackoverflow.com/questions/41625702/is-shutil-mak…

【C++】从C语言入门C++的基础知识

C基础知识 前言1. C关键字2. 命名空间namespace命名空间的创建命名空间的使用命名空间的注意事项 3. C输入&输出4. 缺省参数概念分类全缺省参数半缺省参数 5. 函数重载概念实现C为什么能进行函数重载C和C的相互调用&#xff08;可以不用看&#xff09; 6. 引用概念注意事项…

相参积累

原理 在探测远距离目标时&#xff0c;由于目标回波信号比较微弱&#xff0c;信号幅度很小&#xff0c;从而导致接收信号的信噪比&#xff08;SNR&#xff09;过低&#xff0c;以至于信号处理算法检测不到目标&#xff0c;从而发生漏检。 在脉冲体制雷达中&#xff0c;雷达系统…

Oracle创建物化视图

Oracle创建物化视图 物化视图的语法物化视图的创建关于手动刷新创建手动刷新的物化视图 查看物化视图删除物化视图 物化视图的语法 物化视图的创建语法&#xff0c;如下所示&#xff1a; create materialized view [view_name] [ build immediate | build deferred ] [ refre…

LRU算法和LFU算法

LRU&#xff08;Least Recently Used&#xff09;最近最少使用&#xff0c;淘汰最近最少使用的数据&#xff0c; LFU&#xff08;Least Frequently Used&#xff09;最近最不频繁用&#xff0c;淘汰最不常用的数据。 LRU算法 传统的LRU基于链表实现。基本的一个LRU算法实现就…

Opencv 基本操作八 不均匀光照下的图像二值化探讨

在进行图像二值化时总是存在一些明部、暗部的干扰&#xff0c;单一的使用opencv提供的原始二值化方法很难做到预期效果。一般我们都会采用分块二值化&#xff08;将图像切为多个局部进行二值化&#xff09;、对比度提升&#xff08;对值域进行线性或者非线性变换、直方图均衡化…

C#串口通信从入门到精通(2)——串口相关参数介绍

1、端口号&#xff08;Port&#xff09; 我们使用一个串口的时候&#xff0c;首先是要打开这个串口&#xff0c;那么我们怎么知道电脑上现在支持几个串口呢&#xff1f;对应的端口号又是什么呢&#xff1f; 由于我的电脑系统是window11&#xff0c;下面就以window11为例介绍如…

网络请求实战-缓存、缓存清理和HTTP缓存

目录 缓存介绍 清空策略&#xff08;FIFO&#xff09; 实战&#xff1a;fifo的memory函数 实战&#xff1a;LRU算法 HTTP缓存 Cache-Control 强制缓存 协商缓存 协商缓存-2&#xff08;用的最多的&#xff09; 小结 缓存介绍 早期cpu&#xff0c;内存设计上都有缓存…

开发常用的 Linux 命令4(系统、进程和其它)

开发常用的 Linux 命令4&#xff08;系统、进程和其它&#xff09; 作为开发者&#xff0c;Linux是我们必须掌握的操作系统之一。因此&#xff0c;在编写代码和部署应用程序时&#xff0c;熟练使用Linux命令非常重要。这些常用命令不得不会&#xff0c;掌握这些命令&#xff0…

【JUC】volatile和JMM

【JUC】volatile和JMM 文章目录 【JUC】volatile和JMM1. volatile1.1 特点1.2 内存语义 2. 内存屏障2.1 分类2.2 什么叫保证有序性&#xff1f;2.3 内存屏障的4种插入策略 3. volatile特性3.1 保证可见性3.2 volatile读写过程3.3 没有原子性3.4 指令禁重排(有序性) 4. 正确使用…

python标识符概念及规范

在python中 能取名字的东西非常非常多 例如 我们之前学的变量 以及后面要接触的 函数 类&#xff0c;等等&#xff0c;等等 而我们给这些取的名字 被统称为 标识符 而 python中 标识符的命名也是有限制的 主要有三种 1 内容限定 2 大小写铭感 3 不能使用关键字 内容限定来讲…

leetcode6_N字形变换

如有错误&#xff0c;感谢不吝赐教、交流 leetcode6 题目描述 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I…

HTB-SecNotes

HTB-SecNotes 信息收集8808端口80端口通过CSRF获取通过二次注入 立足tyler -> administrator 信息收集 8808端口 Windows IIS 10.0 可以从官方文档查看10.0版本可能的操作系统。 80端口 通过CSRF获取 目录扫描发现需要登陆后继续进一步操作啊。 对其进行简单的SQL注入测…

数据库基础篇 《7.单行函数》

目录 1. 函数的理解 1.1 什么是函数 1.2 不同DBMS函数的差异 ​编辑1.3 MySQL的内置函数及分类 ​编辑 2. 数值函数 2.1 基本函数 ​编辑 2.2 角度与弧度互换函数 2.3 三角函数 ​编辑 2.4 指数与对数 ​编辑 2.5 进制间的转换 ​编辑3. 字符串函数 ​编辑…

SAM(segment anything model)分割一切 Demo测试及API调用

SAM 分割一切 一&#xff0c;SAM介绍1.1 介绍1.2 项目链接 二&#xff0c;Demo-Test&#xff1a;2.1 Demo功能介绍2.1.1&#xff0c;首页就是这个SAM&#xff0c;点击try demo&#xff0c;可以选择它的自带图片&#xff0c;也可以自己添加。2.1.2 , 自己上传图片测试&#xff1…