代码随想录 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

解题思路

本题是求子序列,则组成子系列的元素可能是不连续的,因此判断第i个元素的子序列的最大长度,需要编译i以前的所有元素。用dpi表示截止第i天的最长子序列的长度。需要用两层for循环遍历,外环遍历nums的每个元素,内环遍历从0到当前元素i的元素,根据题意可知,如果numsi大于numsj,则说明加上当前元素能组成严格递增子序列,dpi在自身和dpj+1取大。最后的结果是取dpi的最大值。

代码实现

cpp 复制代码
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if (nums.size() == 0)  return 0;
        if (nums.size() == 1)  return 1;
        vector<int> dp(nums.size(), 1);
        dp[0] = 1;
        int result = 0;
        for (int i=1;i<nums.size();i++) {
            for (int j=0;j<i;j++) {
                if (nums[i]>nums[j]) {
                    dp[i] = max(dp[i], dp[j]+1);
                }
                result = max(result, dp[i]);
            }
        }
        return result;
    }
};
相关推荐
铅笔侠_小龙虾9 分钟前
Rust 学习(2)-变量、常量与 shadowing
学习·算法·rust
AI科技星16 分钟前
基于全域数学公理体系的三元极值题最简求解法【乖乖数学】
线性代数·算法·游戏·决策树·机器学习·乖乖数学·全域数学
大鱼>1 小时前
宠物异常行为预警系统:边缘计算与实时检测
人工智能·深度学习·算法·iot·宠物
apcipot_rain2 小时前
某双非机试真题
算法
米尔的可达鸭2 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana22 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
神仙别闹2 小时前
编写基于C++ Huffman 算法的无损压缩程序和解压程序
java·c++·算法
大鱼>3 小时前
宠物活动轨迹追踪系统:GPS/BDS+UWB+BLE多定位融合方案
人工智能·深度学习·算法·iot·宠物
闲研随记3 小时前
【文献阅读 ICML 2026】RL算法:R2VPO
论文阅读·人工智能·算法·强化学习·icml·rl算法
旖-旎3 小时前
《LeetCode 646 最长数对链 || LeetCode 1143 最长公共子序列》
c++·算法·leetcode·动态规划