从零学算法300

300.给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:
输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:
输入:nums = [7,7,7,7,7,7,7]
输出:1

  • 最容易想到的肯定就是二重循环的 dp,设 dp[i] 为以 nums[i] 结尾的最长子序列的长度,这时就不是简单的根据 dp[i-1] 推导,因为这个子序列是从前面任何一点连接过来的,比如 […,7,6,9],我这个子序列可能是 [ …,7,9] 也可能是 […,6,9],所以我们要取最大的情况
  •   public int lengthOfLIS(int[] nums) {int[] dp = new int[nums.length];Arrays.fill(dp,1);int max = 1;for(int i=1;i<nums.length;i++){// 往前面所有点找,如果有小于 i 点的说明可能是从 j 连接到 i 的子序列for(int j=i-1;j>=0;j--){if(nums[i]>nums[j])dp[i]=Math.max(dp[j]+1,dp[i]);}// 取 dp[] 中的最大值,不一定是以 nums 尾部结尾的子序列长度最长max = Math.max(dp[i],max);}return max;}
    
  • 还有个 dp + 贪心 + 二分查找的思路:比如两个递增子序列 [1,2,3] 和 [1,2,4],我们会觉得哪个更好,应该是前者,因为它的尾端元素更小,有更大的可能延长下去,所以我们定义 dp[i] 为长度为 i+1 的递增子序列的尾部最小取值,我们初始化 dp[0] 为 nums[0],在遍历过程中只会遇到两种情况
  • nums[i] 大于 dp 尾部元素:那么就把 nums[i] 加在 dp 数组末尾
  • nums[i] 小于 dp 尾部元素:那么就把 nums[i] 替换掉最先大于 dp 数组中的某个数
  • 比如数组 [0,3,1,6,2,2,7,8]的遍历过程:
    1. dp[0] = 0
    2. dp[1] = 3,此时子序列为 03
    3. 这时我们找到了更好的子序列,所以替换 dp[1] 为 1
    4. dp[2] = 6,此时子序列为 016
    5. 我们又找到了更好的子序列,所以替换为 dp[2] 为 2
    6. 跳过
    7. dp[3] = 7
    8. dp[4] = 8
  • 最终我们能得到最长递增子序列 01678
  • 值得注意的是,在遍历过程中,dp 数组并不表示一个完整的递增子序列,这也和我们的定义有关,因为我们只关心递增子序列的尾部元素,所以我们能保证的只是 dp[i] 这一个数是长度为 i+1 的递增子序列的尾部最小取值情况下的尾部元素,而上面的例子只是恰好每次都替换了尾部元素,使得 dp 数组一直能表示一个子序列。
  • 比如数组 [1,2,4,3] 只包含 2 个长度为 3 的子序列 123 和 124,我们只保证 dp[2] 是长度为 3 的最优(尾部元素最小)的递增子序列 123 的尾部元素 3。
  • 比如数组 [3,5,6,2] 我们会得到 dp 数组为 [2,5,6],但并不存在子序列 256,他们只表示长度为 1 的最优子序列为 2,长度为 2 的最优子序列为 x5,长度为 3 的最优子序列为 xx6,管他 x 是几,我们只要得到最后子序列的长度就好
  •   public int lengthOfLIS(int[] nums) {int[] dp = new int[nums.length];dp[0] = nums[0];int index = 0;for(int i=1;i<nums.length;i++){// 大于就添加到 dp 数组尾部if(nums[i]>dp[index])dp[++index]=nums[i];// 小于就替换 dp 数组中最接近且大于它的数else binaryReplace(dp,index,nums[i]);}return index+1;}// 用二分法把小于 dp 数组尾端元素的 nums[i] 替换到 dppublic void binaryReplace(int[] dp,int index,int n){int left = 0, right = index;while(left<=right){int mid = left+(right-left)/2;if(dp[mid]==n)return;else if(dp[mid]<n)left = mid+1;else right = mid-1;}dp[left]=n;}
    

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

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

相关文章

2月20日,每日信息差

第一、中国联通 1 月智慧客服客户问题解决率为 97.9%&#xff0c;大联接用户达 10.02 亿户&#xff0c;5G 套餐用户约 2.64 亿户&#xff0c;物联网终端连接约 5.06 亿户。5G 行业虚拟专网服务客户数为 9185 个&#xff0c;智慧客服问题解决率 97.9%&#xff0c;智能服务占比 8…

仿照elementUI写个步骤条

效果图如下&#xff1a; 直接上代码&#xff1a; <template><div class""><div class"steps"><div class"step" v-for"(step, index) in steps" :key"index"><divclass"icon"click&…

深度学习发展的艺术

将人类直觉和相关数学见解结合后&#xff0c;经过大量研究试错后的结晶&#xff0c;产生了一些成功的深度学习模型。 深度学习模型的进展是理论研究与实践经验相结合的产物。科学家和工程师们借鉴了人类大脑神经元工作原理的基本直觉&#xff0c;并将这种生物学灵感转化为数学模…

微信小程序如何配置服务器域名

要在微信小程序中配置服务器域名&#xff0c;您需要按照以下步骤进行操作&#xff1a; 登录微信公众平台&#xff08;https://mp.weixin.qq.com/&#xff09;。进入小程序管理后台。在左侧菜单中选择"开发"&#xff0c;然后选择"开发设置"。在"服务器…

公司有多个域名,是不是每个域名都安装一个SSL证书?

公司有多个域名&#xff0c;是不是每个域名都安装一个SSL证书&#xff1f; 拥有多个域名可能意味着会增加管理的复杂性和维护成本。如果您的公司有很多个域名&#xff0c;并不是每个域名都要逐个安装SSL证书。可以考虑购买多域名SSL证书或通配符SSL证书&#xff0c;而不是为每…

【Java】上传图片至阿里云oss服务器,文件上传以及图片base64上传

目录 引入maven依赖编写ossUtil编写Controller使用接口工具进行测试测试表单文件上传测试base64文件上传 首先需要在阿里云上开通oss服务&#xff0c;并获取到以下四个信息 endpoint: 购买的服务器节点地址accessKeyId: 接入的keyIdaccessKeySecret: 接入的key秘钥bucketName&…

[计算机网络]---UDP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、端口号…

MyBatis数据库查询

文章目录 什么是MyBatisMyBatis程序的创建MyBatis实现数据库查询传参查询插入实现添加操作获取自增ID删除实现修改实现#{}和${}SQL注入 like查询 resultMap和resultType多表查询 对于普遍的后端开发而言&#xff0c;其程序主要包含了后端主程序和数据库两个部分&#xff0c;用户…

C/C++ BM11 链表相加(二)

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 总结 前言 这道题使用链表来实现加法运算&#xff0c;主要是涉及到数据对位以及加法进位的处理。 题目 假设链表中每一个节点的值都在 0 - 9 之间&#xff0c;那么链表整体就可以代表一个整数。 给定两个这种链表&#xff0…

使用C# Net6连接国产达梦数据库记录

达梦官网&#xff1a;http://www.dameng.com/ 1 下载达梦并进行安装 下载地址&#xff1a;官网首页——服务与合作——下载中心&#xff08;https://www.dameng.com/list_103.html&#xff09; 根据需要自行下载需要的版本&#xff0c;测试版本为&#xff1a;x86 win64 DM8版…

微信商户平台:如何查看超级管理员

如果有普通员工身份&#xff0c;可以登录 https://pay.weixin.qq.com/index.php/core/account/info 扫码进入后&#xff0c;进入菜单&#xff1a;账户中心》商户信息&#xff0c; 即可看到超级管理员的信息。

Windows 重启 explorer 的正确做法

目录 一、关于 Restart Manager 二、重启管理器实例 三、完整实现代码和测试 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_59075481/article/details/136179191。 我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者…

VsCode指定插件安装目录

VsCode指定插件安装目录 VsCode安装的默认目录是在用户目录(%HomePath%)下的.vscode文件夹下的extensions目录下&#xff0c;随着安装插件越来越多会占用大量C盘空间。 指定VsCode的插件目录 Vscode安装目录&#xff1a; D:\Microsoft VS Code\Code.exeVscode插件安装目录&a…

算法沉淀——递归(leetcode真题剖析)

算法沉淀——递归 01.汉诺塔问题02.合并两个有序链表03.反转链表04.两两交换链表中的节点05.Pow(x, n) 递归是一种通过调用自身的方式来解决问题的算法。在递归算法中&#xff0c;问题被分解为更小的相似子问题&#xff0c;然后通过对这些子问题的解进行组合来解决原始问题。递…

firewall防火墙配置实战

基本操作 服务启停操作 #停止firewall systemctl stop firewalld #禁止firewall开机启动 systemctl disable firewalld #开启firewall systemctl start firewalld #开机启动防火墙 systemctl enable firewalld # 查看防火墙状态 firewall-cmd --state systemctl status f…

springboot文件上传需要的配置

总结一下文件上传需要的配置信息&#xff1a; ①在springboot的配置文件中指定请求大小及文件大小&#xff0c;默认大小较小&#xff0c;可能不够 spring.servlet.multipart.max-file-size512MB spring.servlet.multipart.max-request-size512MB ②在springboot的配置文件中…

实现VLAN间通信以太网链路聚合与交换机堆叠、集群华为ICT网络赛道

10.实现VLAN间通信 10.1.使用路由器实现VLAN间通信 使用路由器物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。 路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access. 路由器的一个物理接口作为一…

easyx devc++ 开发具有导出文件夹DLC的瓦片地图编辑器

1. F1保存为 DLC 输出为当前文件目录下。 2. 瓦片的边框利用绘制到 -1 -1 把边框绘制到外部 3. 利用 1 实现网格保留 #include <graphics.h> #include <stdio.h> #include <string.h> #include <io.h> // 保存游戏地图贴图数据 void savegamemap(in…

python常见的数据类型与数据结构(一)数字类型 字符串类型 布尔类型 列表 集合 字典 的定义与常规操作方法

python常见的数据类型与数据结构&#xff08;一&#xff09;数字类型 字符串类型 布尔类型 列表 集合 字典 的定义与常规操作方法 数据类型数字类型字符串类型布尔类型 数据结构列表集合字典 数据类型 数字类型 数字类型有int(整数)&#xff0c;float(浮点数)和complex(复数型…

异步任务超时机制

目录 1、Thread.Join(timeout) 2、Task.WhenAny(task,Task.Delay(timeout)) 3、WaitAsync(timeout) 需主动取消 4、CancellationTokenSource(timeout) 1、Thread.Join(timeout) var thread new Thread(() > {try {Console.WriteLine("Foo start...");Thread…