代码随想录第五十一天 | 300.最长递增子序列 , 674. 最长连续递增序列 , 718. 最长重复子数组

300.最长递增子序列

看完想法:在dp递推公式那里没有太看得懂。首先dp【i】的状态肯定是由前面的dp【0】到dp【i-1】推出的,但是dp【0】到dp【i-1】可以推出dp【i】有个前提就是(nums【i】 > nums【0到i-1任意一个】),例如nums【1】 = 2, nums【3】 = 5,那么可以推出dp【3】 = dp【1】 + 1,反之则不行。可是在nums【0】到nums【i-1】可能不止一个小于nums【i】的数而我们又要取从0到i-1最大的那个递增子序列,所以只能从0到i-1都遍历一遍然后取最大的一个也就是双层循环,外面遍历i里面遍历0到i-1,所以就可以用j来表示0到i-1的数那么就可以得出递推公式 if(nums【i】>nums【j】)dp【i】 = max(dp【i】, dp【j】 + 1);

cpp 复制代码
int lengthOfLIS(vector<int>& nums) {
        //0,1单独考虑
        if (nums.size() <= 1) return nums.size();
        //根据定义,可以只定义到nums.size()
        vector<int> dp(nums.size(), 1);
        //设置resize
        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);
            }
            if (dp[i] > result) result = dp[i]; // 取长的子序列
        }
        return result;

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

674. 最长连续递增序列

看完想法:最长递增和最长连续递增有很大的区别。最长连续递增序列是 [1,3,5], 长度为3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开在递推公式中展现了这二者的区别,最长连续递增只需要考虑dp[i] 和dp[i-1],不需要考虑i-1之前的,所以只需要单层for循环

cpp 复制代码
int findLengthOfLCIS(vector<int>& nums) {
        //0,1单独考虑
        if (nums.size() <= 1) return nums.size();
        //根据定义,可以只定义到nums.size()
        vector<int> dp(nums.size(), 1);
        //设置resize
        int result = 0;
        for (int i = 1; i < nums.size(); i++) {
            int j = i-1;
            if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
            
            if (dp[i] > result) result = dp[i]; // 取长的子序列
        }
        return result;

    }

时间复杂度:O(n)

718. 最长重复子数组

看完想法:注意题目中说的子数组,其实就是连续子序列。根据卡哥的想法,dp[i][j]数组的定义是下标为i-1的A和下标为j-1的B的最长重复子序列。如果定义下标为i也可以,就是会在数组初始化的时候比较麻烦,需要自己定义第一行和第一列 。递推公式:dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;

cpp 复制代码
vector<vector<int>> dp (nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
        int result = 0;
        for (int i = 1; i <= nums1.size(); i++) {
            for (int j = 1; j <= nums2.size(); j++) {
                if (nums1[i - 1] == nums2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                if (dp[i][j] > result) result = dp[i][j];
            }
        }
        return result;
相关推荐
ComputerInBook20 分钟前
C++ 14 相比 C++ 11新增之特征
开发语言·c++·c++ 14
Aaron158825 分钟前
全频段 SDR干扰源模块解决方案(星链干扰、LORA无人机干扰)
人工智能·算法·fpga开发·硬件架构·硬件工程·无人机·信息与通信
AI科技星29 分钟前
全域数学·球面拓扑微扰标准系数η=0.01 应用详解(典籍正式版)
人工智能·算法·数学建模·数据挖掘·机器人
微风欲寻竹影29 分钟前
Java数据结构——栈(Stack)详解
java·开发语言·数据结构
Peter·Pan爱编程34 分钟前
成员函数与 this 指针:函数属于数据
c++
牢姐与蒯40 分钟前
C++数据结构之红黑树
数据结构
逻辑君43 分钟前
物理学研究报告【20260001】
人工智能·算法
YL200404261 小时前
041二叉树的层序遍历
数据结构·leetcode·bfs
AI科技星1 小时前
算法联盟·全域数学公理体系下黑洞标量毛发与LVK引力波O4全维理论、求导、证明、计算、验证、分析
人工智能·线性代数·算法·架构·学习方法·量子计算
谙弆悕博士1 小时前
【附C语言源码】C语言 栈结构 实现及其扩展操作
c语言·开发语言·数据结构·算法·链表·指针·