当前位置: 首页 > news >正文

算法训练营第五十二天|300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

目录

  • Leetcode300.最长递增子序列
  • Leetcode674. 最长连续递增序列
  • Leetcode718. 最长重复子数组

Leetcode300.最长递增子序列

文章链接:代码随想录
题目链接:300.最长递增子序列

思路:数组存在就至少为一,dp元素初始化为1

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if (nums.size() == 1) return 1;
        vector<int> dp(nums.size(), 1);
        int result = 1;
        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 = result > dp[i] ? result : dp[i];
        }
        return result;
    }
};

Leetcode674. 最长连续递增序列

文章链接:代码随想录
题目链接:674. 最长连续递增序列

思路:连续的话,比较相邻元素即可。

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        vector<int> dp(nums.size(), 1);
        int result = 1;
        for (int i = 1; i < nums.size(); i++){
            if (nums[i] > nums[i - 1]) dp[i] = dp[i - 1] + 1;
            result = result > dp[i] ? result : dp[i];
        }
        return result;
    }
};

Leetcode718. 最长重复子数组

文章链接:代码随想录
题目链接:718. 最长重复子数组

思路:二维数组,创建数组时多建一层是为了避免初始化,否则就得在循环前先初始化一遍dp[i][0]和dp[0][j]。

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp(nums1.size() + 1, vector<int>(nums2.size() + 1));
        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 = result > dp[i][j] ? result : dp[i][j];
            }
        }
        return result;
    }
};

滚动(一维)数组,不等要有赋0操作。理论上说不等也最起码有dp[j - 1]个子字符串相等,但是这个值会影响下一层的判断,若下一层的两元素相等,则会得出错误结果,故不等需要赋0。而每个相等字符串的长度都会有一个元素记录过,无需担心漏记。
和背包问题同样 j 的后序遍历是为了避免错误累加。

class Solution {
public:
    int findLength(vector<int>& nums1, vector<int>& nums2) {
        vector<int> dp(nums2.size() + 1);
        int result = 0;
        for (int i = 1; i <= nums1.size(); i++){
            for (int j = nums2.size(); j > 0; j--){
                if (nums1[i - 1] == nums2[j - 1]){
                    dp[j] = dp[j - 1] + 1;
                }else dp[j] = 0;
                result = result > dp[j] ? result : dp[j];
            }
        }
        return result;
    }
};

第五十二天打卡,加油!!!

相关文章:

  • 软件工程研究生后期总结
  • 【Vue技巧】vue3中不支持.sync语法糖的解决方案
  • Flink启动Yarn Session报错:Couldn‘t deploy Yarn session cluster
  • 免费chartGPT网站汇总
  • Android aar包集成与报错
  • [python]裁剪文件夹中所有pdf文档并按名称保存到指定的文件夹
  • 写点东西《什么是网络抓取?》
  • 音乐人声分离工具:极简的人声和背景音乐分离工具
  • OB OCP工具
  • Linux消息队列
  • C盘满了,我用什么思路清理?
  • git add -u 什么意思
  • AEB滤镜再破碎,安全焦虑「解不开」?
  • Redis 持久化
  • 20个超实用的JavaScript高级技巧
  • 前端_we码
  • Java 8 简化代码(1)
  • Python-基础篇-类与对象/面向对象程序设计
  • 技术硬实力,阿里巴巴为什么要开源Spring Cloud Alibaba?
  • spring boot学习第八篇:kafka
  • 山东:小伙为救同学耽误考试属实,启用副题安排考试
  • 视频|王弘治:王太后,“先天宫斗圣体”?
  • 从“求生”到“生活”:医保纳入创新药让梗阻性肥厚型心肌病患者重拾生活掌控权
  • 60余年产业积累,“江苏绿心”金湖炼就“超级石油工具箱”
  • 观众走入剧院空间,人艺之友一起“再造时光”
  • 尹锡悦涉嫌发动内乱案举行第三次庭审