欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > 300. 最长递增子序列

300. 最长递增子序列

2025/11/11 23:38:03 来源:https://blog.csdn.net/2401_88475903/article/details/147961056  浏览:    关键词:300. 最长递增子序列

        理解最长递增子序列(LIS)是解决该问题的关键。子序列是从给定数组中按顺序选取的元素序列,例如数组 [1, 2, 3, 4, 5] 的子序列可以是 [2, 3, 4]。需要注意的是,子序列的元素在原数组中不一定是连续的。因此,最长递增子序列就是在所有可能的递增子序列中,找出长度最长的那个。

        本题是一个典型的动态规划问题,我们可以通过定义状态和状态转移方程来解决:

状态定义: dp[i] 表示以第 i 个元素为结尾的最长递增子序列的长度。

状态转移方程: 根据递增的定义,如果当前元素 nums[i] 大于之前的某个元素 nums[j],那么 dp[i] 可以由 dp[j] 转移而来,即 dp[i] = max(dp[j] + 1, dp[i])

边界条件: 每个元素本身就是一个长度为 1 的递增子序列,因此 dp[i] 的初始值应设为 1。

        此外,由于最长递增子序列可能以任意元素结尾,因此在计算过程中需要维护 dp 数组的最大值作为最终结果。

        代码

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

        时间复杂度:O(n^2)

        空间复杂度:O(n)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词