Leetcode——最长递增子序列

1. 题目链接:300. 最长递增子序列

2. 题目描述:

给你一个整数数组 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

提示:

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

3. 解法1(暴力搜索):

【时间复杂度过高会超时】

3.1 算法思路:

  1. 递归含义:给dfs一个使命,给他应该数i,返回以i位置为起点的最长递增序列的长度
  2. 函数体:遍历i后面的所有位置,看看谁能加到i这个元素的后面。统计所有情况下的最大值
  3. 递归出口:因为我们是判断之后再进入递归的,因此没有出口

请添加图片描述

3.2 C++算法代码:

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int ret=0;for(int i=0;i<nums.size();i++){ret=max(ret,dfs(i,nums));}return ret;}int dfs(int pos,vector<int>&nums){int ret=1;for(int i=pos+1;i<nums.size();i++){if(nums[i]>nums[pos])ret=max(ret,dfs(i,nums)+1);}return ret;}
};

4. 解法2(记忆化搜索):

4.1 算法思路:

  1. 加上一个备忘录
  2. 每次进入递归的时候,去备忘录里面看看
  3. 每次返回的时候,将结果加入到备忘录里面

请添加图片描述

4.2 C++算法代码:

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int ret=0; // 初始化最长递增子序列的长度为0int n=nums.size(); // 获取数组长度vector<int> memo(n); // 创建一个与nums长度相同的memo数组,用于存储每个位置的最长递增子序列长度for(int i=0;i<n;i++) // 遍历nums数组{ret=max(ret,dfs(i,nums,memo)); // 更新最长递增子序列的长度}return ret; // 返回最长递增子序列的长度}int dfs(int pos,vector<int>&nums,vector<int>&memo) // 深度优先搜索函数,用于计算以pos位置为结尾的最长递增子序列的长度{if(memo[pos]!=0) return memo[pos]; // 如果memo数组中已经存在以pos位置为结尾的最长递增子序列的长度,则直接返回该值int ret=1; // 初始化以pos位置为结尾的最长递增子序列的长度为1for(int i=pos+1;i<nums.size();i++) // 遍历nums数组,从pos+1开始{if(nums[i]>nums[pos]) // 如果当前元素大于pos位置的元素ret=max(ret,dfs(i,nums,memo)+1); // 更新以pos位置为结尾的最长递增子序列的长度}memo[pos]=ret; // 将计算出的以pos位置为结尾的最长递增子序列的长度存入memo数组return ret; // 返回以pos位置为结尾的最长递增子序列的长度}
};

5. 解法3(动态规划):

5.1 算法思路:

  1. 递归含义->状态表示

  2. 函数体->状态转移方程

  3. 递归出口->初始化

请添加图片描述

5.2 C++算法代码:

class Solution {
public:// 计算最长递增子序列的长度int lengthOfLIS(vector<int>& nums) {int n = nums.size(); // 获取数组长度vector<int> dp(n, 1); // 初始化动态规划数组,dp[i]表示以nums[i]结尾的最长递增子序列的长度int ret = 0; // 初始化最长递增子序列的长度为0// 从后往前遍历数组for (int i = n - 1; i >= 0; i--) {// 遍历当前元素之后的元素for (int j = i + 1; j < n; j++) {// 如果当前元素大于后面的元素,更新dp[i]的值if (nums[j] > nums[i]) {dp[i] = max(dp[i], dp[j] + 1);}}ret = max(ret, dp[i]); // 更新最长递增子序列的长度}return ret; // 返回最长递增子序列的长度}
};

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

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

相关文章

F. Alex‘s whims Codeforces Round 909 (Div. 3) 1899F

Problem - F - Codeforces 题目大意&#xff1a;有q次询问&#xff0c;每次询问给出一个数x&#xff0c;要求构造一棵n个点的树&#xff0c;使得对于每次询问&#xff0c;树上都有一条简单路径的长度等于x&#xff0c;同时每次询问前可以对树进行一次操作&#xff0c;即将一个…

泛微E-Cology CheckServer.jspSQL注入漏洞(QVD-2023-9849) 复现

泛微E-Cology CheckServer.jspSQL注入漏洞(QVD-2023-9849) 复现 1.漏洞描述 泛微 Ecology OA 系统对用户传入的数据过滤处理不当&#xff0c;导致存在 SQL 注入漏洞&#xff0c;未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令&#xff0c;从而窃取数据库敏感信息。 …

使用ADS进行serdes仿真时,Tx_Diff中EQ的设置对发送端波形的影响。

研究并记录一下ADS仿真中Tx_Diff的EQ设置。原理图如下&#xff1a; 最上面是选择均衡方法Choose equalization method&#xff1a;Specify FIR taps&#xff0c;Specify de-emphasis和none。 当选择Specify de-emphasis选项时&#xff0c;下方可以输入去加重具体的dB值&#x…

typora使用PicGo自动上传图片到chevereto图床

typora使用PicGo自动上传图片到chevereto图床 近期发现&#xff0c;gitee图床不能用了。github又涉及科学上网。搜索了开源图床方案&#xff0c;找到了chevereto&#xff0c;使用起来还不错。分享给大家。 文章目录 typora使用PicGo自动上传图片到chevereto图床chevereto图床安…

java使用 TCP 的 Socket API 实现客户端服务器通信

一&#xff1a;什么是 Socket(套接字) Socket 套接字是由系统提供于网络通信的技术, 是基于 TCP/IP 协议的网络通信的基本操作&#xff0c;要进行网络通信, 需要有一个 socket 对象, 一个 socket 对象对应着一个 socket 文件, 这个文件在 网卡上而不是硬盘上, 所以有了 sokcet…

ForkLift:macOS文件管理器/FTP客户端

ForkLift 是一款macOS下双窗口的文件管理器&#xff0c;可以代替本地的访达。ForkLift同时具备连接Ftp、SFtp、WebDav以及云服务器。 ForkLift还具备访达不具备的小功能&#xff0c;比如从文件夹位置打开终端&#xff0c;显示隐藏文件&#xff0c;制作替换等功能。ForkLift 是一…

Linux本地docker一键部署traefik+内网穿透工具实现远程访问Web UI管理界面

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

代码随想录算法训练营第24天|77. 组合

JAVA代码编写 77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2&#xff1a; 输入…

HP惠普光影精灵7笔记本Victus by HP 16.1英寸游戏本16-d0000原装出厂Windows11.21H2预装OEM系统

下载链接&#xff1a;https://pan.baidu.com/s/1LGNeQR1AF1XBJb5kfZca5w?pwdhwk6 提取码&#xff1a;hwk6 可适用的型号&#xff1a; 16-d0111tx&#xff0c;16-d0112tx&#xff0c;16-d0125tx&#xff0c;16-d0127tx&#xff0c;16-d0128tx&#xff0c;16-d0129tx&#…

【js作用域】JavaScript中作用域的是什么?:从编译时其承担什么角色和查询作用域中的变量的角度解析作用域

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript进阶指南 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继…

Python语言这么火热,其实具有以下特点

Python语言具有以下特点&#xff1a; 简单易学&#xff1a;Python语言是一种解释型语言&#xff0c;语法简单明了&#xff0c;代码简洁&#xff0c;易于理解&#xff0c;可以一边编码一边运行&#xff0c;非常合适编程初学者。门槛较低&#xff1a;Python不需要复杂的环境配置…

【面试经典150 | 数学】Pow(x, n)

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;快速幂-递归方法二&#xff1a;快速幂-迭代 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主…