刷题笔记_6 | 动态规划 | C++ | LeetCode300最长递增子序列

博客围绕LeetCode中求整数数组最长严格递增子序列长度的题目展开。介绍了两种动态规划解题思路,一是记录以当前点为结尾的最长子序列,二是设计特定长度下对应的最小数值。还给出了C++实现代码,并列出相关参考文献。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

题目:链接

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

解题思路:

本题主要采用动态规划的方法:
方法一,遍历的时候,记录以当前点为结尾的最长子序列,dp[i],表示以nums[i]为结尾的最长子序列,而dp[i]的取值为:j 在 0 ~ i范围内满足nums[i] > nume[j] 且 dp[j]是dp[0~i]中最大的,则dp[i] = dp[j]+1
|
方法二:设计dp[j]为,j长度下对应的最小的数值,那么当对数组进行遍历时,对于当前的nums[i],如果dp中元素都比它小,将它插到最后,否则,用它覆盖掉比它大的元素中最小的那个。

C++实现

方法一

public:
    int lengthOfLIS(vector<int>& nums) {
        int s = nums.size();
        vector<int> dp(s,1);

        for(int i = 0; i < s; i++){
            for(int j = 0; j < i; j++){
                if(nums[i] > nums[j]){
                    dp[i] = max(dp[i], dp[j] + 1);
                }
            }
        }

        return *max_element(dp.begin(), dp.end());
    }
};

方法二:

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int s = nums.size();
        if(s < 2) return s; 
        vector<int> dp;
        dp.push_back(nums[0]);
        int l, r;
        l = r = 0;
        for(int i = 1; i < s; i++){
            if(nums[i] > dp.back()){
                dp.push_back(nums[i]);
            }
            else{
                l = 0;
                r = dp.size() - 1;
                int m;
                while(l < r){
                    m = l + (r - l) / 2;
                    if(dp[m] < nums[i]){
                        l = m + 1;
                    }
                    else{
                        r = m;
                    }
                }
                dp[l] = nums[i];
            }
        }

        return dp.size();
  }
};

参考文献:

C++中Vector求最大值最小值
C++ vector 容器浅析
解题思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值