day55 最长递增子序列 最长连续递增子序列 最长重复子数组

这篇具有很好参考价值的文章主要介绍了day55 最长递增子序列 最长连续递增子序列 最长重复子数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目1  300 最长递增子序列

题目链接 300 最长递增子序列

题意

找到整数数组nums的最长严格递增子序列的长度(子序列并不改变原始的顺序,但是可以删除元素)

动态规划

动规五部曲

1)dp数组及下标i的含义

dp[i] 表示以nums[i]为结尾的最长递增子序列的长度

2)dp数组初始化

根据定义 长度至少是1  dp[i] = 1

3)递推公式

j从0到i-1各个位置的最长升序子序列 + 1 的最大值 

要计算每个当前值dp[i]与现在遍历的nums[j]的长度的大小关系 每一个值都要进行比较

if(nums[i] > nums[j]) dp[i] = max(dp[j]+1,dp[i])

4)遍历顺序

根据递推公式 当前长度依赖于之前的结果  i从小到大遍历 j的遍历顺序无所谓,只要把i-1的范围内的值遍历完就ok

for(i=1;i<nums.size(); i++){

     for(j=0;j<i;j++){

      }

}

5)打印dp数组

day55 最长递增子序列 最长连续递增子序列 最长重复子数组,leetcode,算法

代码文章来源地址https://www.toymoban.com/news/detail-848218.html

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        //定义dp数组  初始化
        vector<int> dp(nums.size(), 1);
        int result = 0;
        for(int i = 0; i < nums.size(); i++){
            for(int j = 0; j < i; j++){
                if(nums[i] > nums[j]) dp[i] = max(dp[j] + 1, dp[i]);
            }
            result = max(result, dp[i]);
        }
        return result;
    }
};
  • 时间复杂度: O(n^2)
  • 空间复杂度: O(n)

题目2   674 最长连续递增子序列

题目链接  674 最长连续递增序列

题意

找到未排序的整数数组的最长且连续递增的子序列的长度(不能删减元素了)

动态规划

动规五部曲

1)dp数组及下标i的含义

dp[i] 表示以nums[i]为结尾的最长连续递增子序列的长度

2)dp数组初始化

至少包含1个元素  dp[i] = 1

3)递推公式

只比较nums[i]与nums[i-1]即可,这样才可以保证是连续 

不用去比较nums[j]与nums[i] (j是在0到i之间遍历)

if(nums[i] > nums[i-1]) dp[i] = dp[i-1] + 1

4)遍历顺序

根据递推公式 dp[i]依赖于dp[i-1]  从前往后推导

5)打印dp数组

day55 最长递增子序列 最长连续递增子序列 最长重复子数组,leetcode,算法

代码

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        //定义dp数组 初始化
        vector<int> dp(nums.size(), 1);
        int result = 1;  //对于只有1个元素的数组
        for(int i = 1; i < nums.size(); i++){
            if(nums[i] > nums[i-1]) dp[i] = dp[i-1] + 1;
            result = max(result, dp[i]);
        }
        return result;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

题目3  718 最长重复子数组

题目链接  718 最长重复子数组

题意

返回两个整数数组nums1和nums2的公共的最长子数组的长度

动态规划

动规五部曲

1)dp数组及下标i的含义

想到使用二维dp数组可以记录两个字符串的所有比较情况

dp[i][j] 表示以nums1[i-1]结尾的数组和以nums2[j-1]结尾的数组的公共最长子数组的长度

2)dp数组初始化

根据递推公式 初始化第一行第一列

根据dp数组定义 dp[i][0] 与 dp[0][j] 没有意义

根据递推公式 是在上一个基础上加1 应该从0开始往上加 dp[i-1][0] = 0  dp[0][j-1] = 0  其他下标可初始为任意值

3)递推公式

根据dp数组的定义 dp[i][j]以nums1[i-1]结尾 nums2[j-1]结尾  所以比较nums1[i-1]与nums2[j-1]

if(nums1[i-1] == nums2[j-1]) dp[i][j] = dp[i-1][j-1] + 1

4)遍历顺序

遍历2个数组的顺序谁先谁后均可 只要把两个数组遍历完即可

之所以有等号,根据dp数组的定义 dp[i][j]以nums1[i-1]结尾 nums2[j-1]结尾

等号代表 nums1[nums1.size()-1]   nums2[nums2.size()-1]

for(i=1;i<=nums1.size();i++){

   for(j=1;j<=nums2.size();j++){

   }

}

5)打印dp数组

day55 最长递增子序列 最长连续递增子序列 最长重复子数组,leetcode,算法

代码

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        //定义dp数组  初始化dp数组
        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;
                }
                result = max(result, dp[i][j]);
            }
        }
        return result;
    }
};
  • 时间复杂度:O(n × m),n 为nums1长度,m为nums2长度
  • 空间复杂度:O(n × m)

到了这里,关于day55 最长递增子序列 最长连续递增子序列 最长重复子数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划9:最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列、不相交的线、最长子序和

    例题300: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 确定dp数组和下标含义 dp[i]表示在第i个元素的最长子序列数

    2024年04月08日
    浏览(43)
  • Leetcode:300. 最长递增子序列、674. 最长连续递增序列(C++)

    目录 300. 最长递增子序列 题目描述: 实现代码: 原理思路: 674. 最长连续递增序列 题目描述: 实现代码: 原理思路: 题目描述:         给你一个整数数组  nums  ,找到其中最长严格递增子序列的长度。 子序列  是由数组派生而来的序列,删除(或不删除)数组中

    2024年02月11日
    浏览(55)
  • leetcode300. 最长递增子序列 子序列(不连续)

    https://leetcode.cn/problems/longest-increasing-subsequence/ 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 LIS即最长上升子序列,指

    2024年02月14日
    浏览(42)
  • 【Leecode】674. 最长连续递增序列

    Given an unsorted array of integers nums , return the length of the longest continuous increasing subsequence (i.e. subarray). The subsequence must be strictly increasing. A continuous increasing subsequence is defined by two indices l and r (l r) such that it is [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] and for each l = i r , nums[i] nums[i + 1] . E

    2024年02月07日
    浏览(45)
  • 每日一题之最长连续递增序列

    题目链接 给定一个未经排序的整数数组,找到最长且 连续递增的子序列 ,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r ( l r )确定,如果对于每个 l = i r ,都有 nums[i] nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

    2024年02月12日
    浏览(38)
  • 最长连续不重复子序列(双指针)

    含义 双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。 另外还可以根据序列进行区分,例如在快排中,双指针指向的是同一个序列,而归并排序

    2024年02月05日
    浏览(36)
  • 799. 最长连续不重复子序列 java

    目录 算法描述 输入格式 输出格式 数据范围 输入样例: 输出样例: 代码 算法分析 给定一个长度为 n� 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数 n�。 第二行包含 n� 个整数(均在 0∼1050∼105 范围内),表示整

    2024年02月06日
    浏览(32)
  • 蓝桥杯-双指针 | 最长连续不重复子序列 | 算法基础

    ⭐ 简单说两句 ⭐ ✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! 🔒 以下内容仅对你可见~ 作者: 后端小知识 , CSDN后端领域新星创作者 |阿里云专家博主 CSDN 个

    2024年02月03日
    浏览(46)
  • [100天算法】-最长递增子序列的个数(day 47)

    思路 代码 JavaScript Code C++ Code 复杂度分析 时间复杂度:$O(N^2)$。N 是数组  nums  的长度。 空间复杂度:$O(N)$。N 是辅助数组  length  和  count  的长度。

    2024年02月07日
    浏览(47)
  • 【LeetCode: 673. 最长递增子序列的个数 | 动态规划】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月03日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包