【LeetCode热题100】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

提示:

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

进阶:

你能将算法的时间复杂度降低到 O(n log(n)) 吗?

四.解题思路

解法1:动态规划, d p [ i ] dp[i] dp[i] 表示以 n u m s [ i ] nums[i] nums[i] 结尾的 最长递增子序列 LIS 的长度。时间复杂度 O ( n 2 ) O(n^2) O(n2)

解法2:贪心 + 二分查找。时间复杂度 O ( n   l o g   n ) O(n\,log\,n) O(nlogn)

思路来自:最长递增子序列(nlogn 二分法、DAG 模型 和 延伸问题)

五.代码实现

解法1:

cpp 复制代码
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {

        vector<int> dp(nums.size());

        dp[0] = 1;

        for (int i = 1; i < nums.size(); i++) {
            int theMax = 1;
            for (int j = 0; j < i; j++) {
                if (nums[j] < nums[i]) {
                    theMax = max(theMax, dp[j] + 1);
                }
            }
            dp[i] = theMax;
        }
        return *max_element(dp.begin(), dp.end());
    }
};

解法2:

cpp 复制代码
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {

        vector<int> sup;
        for (int num : nums) {
            auto it = ranges::lower_bound(sup, num);
            if (it == sup.end()) {
                sup.push_back(num);
            } else {
                *it = num;
            }
        }
        return sup.size();
    }
};

六.题目总结

lower_bound(fisrt, last) 返回指向范围 [first, last) 中首个不小于(即大于或等于) value 的元素的迭代器,若找不到这种元素返回 last。

相关推荐
想唱rap7 分钟前
应用层协议与序列化
linux·运维·服务器·网络·数据结构·c++·算法
重生之我是Java开发战士13 分钟前
【笔试强训】Week3:重排字符串,分组,DNA序列
算法
We་ct14 分钟前
LeetCode 97. 交错字符串:动态规划详解
前端·算法·leetcode·typescript·动态规划
热心网友俣先生19 分钟前
2026年第二十三届五一数学建模竞赛B题四问参考答案+多算法对比
算法·数学建模
无敌昊哥战神19 分钟前
【LeetCode 37】解数独 (Sudoku Solver) —— 回溯法详解 (Python/C/C++)
c语言·c++·python·算法·leetcode
风筝在晴天搁浅25 分钟前
LeetCode 162.寻找峰值
算法·leetcode
itzixiao42 分钟前
L1-067 洛希极限(10分)[java][python]
java·开发语言·算法
jinyishu_1 小时前
链表经典OJ题
c语言·数据结构·算法·链表
葫三生1 小时前
三生原理文章被AtomGit‌开源社区收录的意义探析?
人工智能·深度学习·神经网络·算法·搜索引擎·开源·transformer
AI进化营-智能译站1 小时前
ROS2 C++开发系列15-模板实现通用算法|宏定义ROS2调试开关|一次编码适配多平台
java·c++·算法·ai