1.31-子序列问题

devtools/2025/2/12 4:11:09/

Code-1.31-子序列问题

leetcode.cn/problems/longest-increasing-subsequence/" rel="nofollow">300. 最长递增子序列

题目分析

1. 状态表示

dp[i]表示:以i结尾的所有子序列中,最长递增子序列的长度。

2. 状态转移方程
  • dp[i]
    • 长度为1 -> 1
    • 长度大于1 -> nums[j] < nums[i] -> max(dp[j] + 1)
3. 初始化

把表里所有值初始化为1

4. 填表顺序

从左往右。

5. 返回值

dp表中的最大值。

代码实现

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

leetcode.cn/problems/wiggle-subsequence/" rel="nofollow">376. 摆动序列

分析:用多状态dp表完成。

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();if (n == 1) return 1;if (n == 2 && nums[0] != nums[1]) return 2;vector<int> f(n, 1), g(n, 1); // f表示最后一个数位较小的数的摆动序列的最长子序列的长度,g表示较大的。int ret = 0;for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] < nums[j]) f[i] = max(g[j] + 1, f[i]);if (nums[i] > nums[j]) g[i] = max(f[j] + 1, g[i]);}ret = max(max(f[i], g[i]), ret);}return ret;}
};

leetcode.cn/problems/number-of-longest-increasing-subsequence/" rel="nofollow">673. 最长递增子序列的个数

分析:想快速得到个数,需要再添加一个辅助计数的数组。

class Solution {
public:int findNumberOfLIS(vector<int>& nums) {int n = nums.size(), maxLen = 0, ans = 0;vector<int> dp(n, 1), cnt(n, 1);for (int i = 0; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[j] < nums[i]) {if (dp[j] + 1 > dp[i]) {dp[i] = dp[j] + 1;cnt[i] = cnt[j];} else if (dp[j] + 1 == dp[i]) {cnt[i] += cnt[j];}}}if (dp[i] > maxLen) {maxLen = dp[i];ans = cnt[i];} else if (dp[i] == maxLen){ans += cnt[i];}}return ans;}
};

leetcode.cn/problems/maximum-length-of-pair-chain/" rel="nofollow">646. 最长数对链

分析:先排序再做。

class Solution {
public:int findLongestChain(vector<vector<int>>& pairs) {sort(pairs.begin(), pairs.end());int n = pairs.size(), ans = 0;vector<int> dp(n, 1);for (int i = 0; i < n; i++) {for (int j = 0; j < i; j++) {if (pairs[i][0] > pairs[j][1]) dp[i] = max(dp[j] + 1, dp[i]);}ans = max(ans, dp[i]);}return ans;}
};

leetcode.cn/problems/longest-arithmetic-subsequence-of-given-difference/" rel="nofollow">1218. 最长定差子序列

分析:下面的代码在leetcode上会超时。

class Solution {
public:int longestSubsequence(vector<int>& arr, int difference) {int n = arr.size(), ans = 0;vector<int> dp(n, 1);for (int i = 0; i < n; i++) {for (int j = 0; j < i; j++)if (arr[i] - arr[j] == difference) {dp[i] = max(dp[j] + 1, dp[i]);}ans = max(dp[i], ans);}return ans; }
};

分析:用hash储存就不会超时了。

class Solution {
public:int longestSubsequence(vector<int>& arr, int difference) {unordered_map<int, int> hash;hash[arr[0]] = 1;int ret = 1;for (int i = 1; i < arr.size(); i++) {hash[arr[i]] = hash[arr[i] - difference] + 1;ret = max(ret, hash[arr[i]]);}return ret;}
};

leetcode.cn/problems/Q91FMA/" rel="nofollow">LCR 093. 最长的斐波那契子序列的长度

分析:同样地,如果不借助hash,时间复杂度会飙到 n 3 n^3 n3

class Solution {
public:int lenLongestFibSubseq(vector<int>& arr) {int n = arr.size();if (n < 3) return 0;unordered_map<int, int> hash;vector<vector<int>> dp(n, vector<int>(n, 0));int ret = 0;hash[arr[0]] = 0;for (int i = 1; i < n; i++) {for (int j = i + 1; j < n; j++) {int a = arr[j] - arr[i];if(hash.count(a))dp[i][j] = dp[hash[a]][i] + 1;ret = max(ret, dp[i][j]);}hash[arr[i]] = i;}return ret == 0 ? 0 : ret + 2;}
};

leetcode.cn/problems/longest-arithmetic-subsequence/" rel="nofollow">1027. 最长等差数列

分析:本题与上一题没什么区别。

class Solution {
public:int longestArithSeqLength(vector<int>& nums) {int n = nums.size();vector<vector<int>> dp(n, vector<int>(n, 2));int ret = 2;unordered_map<int, int> hash;hash[nums[0]] = 0;for (int i = 1; i < n; i++) {for (int j = i + 1; j < n; j++) {int a = 2 * nums[i] - nums[j];if(hash.count(a))dp[i][j] = dp[hash[a]][i] + 1;ret = max(ret, dp[i][j]);}hash[nums[i]] = i;}return ret;}
};

leetcode.cn/problems/arithmetic-slices-ii-subsequence/" rel="nofollow">446. 等差数列划分 II - 子序列

分析:还是一样的套路,但是hash的封装应有所不同了。

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();vector<vector<int>> dp(n, vector<int>(n));unordered_map<long long, vector<int>> hash;for (int i = 0; i < n; i++) hash[nums[i]].push_back(i);int sum = 0;for (int j = 2; j < n; j++) {for (int i = 1; i < j; i++) {long long k = (long long) 2 * nums[i] - nums[j];for (auto e : hash[k]) {if (e < i) dp[i][j] += dp[e][i] + 1;} sum += dp[i][j];}}return sum;}
};

http://www.ppmy.cn/devtools/158106.html

相关文章

aio-pika 快速上手(Python 异步 RabbitMQ 客户端)

目录 简介官方文档如何使用 简介 aio-pika 是一个 Python 异步 RabbitMQ 客户端。5.0.0 以前 aio-pika 基于 pika 进行封装&#xff0c;5.0.0 及以后使用 aiormq 进行封装。 https://github.com/mosquito/aio-pikahttps://pypi.org/project/aio-pika/ pip install aio-pika官…

C#操作excel数据,第一步先保存到Redis,第二步再保存到Sql Server数据库。第三步同步到MongoDB中

以下是一个完整的C#示例,展示如何将Excel数据依次保存到Redis、SQL Server和MongoDB中。代码分为三个步骤,并使用异步编程模型提高性能。 --- ### **实现步骤** 1. **读取Excel数据**:使用 `EPPlus` 库读取Excel文件。 2. **保存到Redis**:使用 `StackExchange.Redis` 将…

C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输

CURL开源库介绍 CURL 是一个功能强大的开源库&#xff0c;用于在各种平台上进行网络数据传输。它支持众多的网络协议&#xff0c;像 HTTP、HTTPS、FTP、SMTP 等&#xff0c;能让开发者方便地在程序里实现与远程服务器的通信。 CURL 可以在 Windows、Linux、macOS 等多种操作系…

curl与telnet的区别

协议支持&#xff1a;curl支持多种协议&#xff0c;如HTTP、HTTPS、FTP等&#xff0c;而telnet主要用于基于TCP协议的连接。 功能&#xff1a;curl是一个功能强大的工具&#xff0c;可以用来发送各种HTTP请求、下载文件等&#xff0c;而telnet主要用于在远程服务器上进行简单的…

vue3+vite全局loading

vue3vite全局loading j-loading.vue组件 <template><transition enter-active-class"animate__animated animate__fadeIn"leave-active-class"animate__animated animate__fadeOut"><div class"root-box" v-if"show"…

网络通信的精髓:透彻理解 TCP/IP 的三次握手与四次挥手

网络通信的精髓:透彻理解 TCP/IP 的三次握手与四次挥手** 引言 在浩瀚的网络世界中,信息如流水般穿梭于全球各地,支撑着我们日常的在线互动、数据传输和云端服务。而这一切高效、可靠的网络通信,都离不开一个幕后英雄——TCP/IP 协议栈。它犹如网络的“骨架”和“神经系统…

docker启动报错code=exited, status=1/FAILURE——问题排查

问题 在某台centos7机器上&#xff0c;启动docker服务 sudo systemctl start docker报下列错误&#xff1a; ● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: …

java后端开发day13--面向对象综合练习

&#xff08;以下内容全部来自上述课程&#xff09; 注意&#xff1a;先有javabean&#xff0c;才能创建对象。 1.文字版格斗游戏 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人物的时候&#xff08;new对象的时候&#…