leetcode 1035. Uncrossed Lines

题目描述

本题本质上就是求nums1和nums2的最长公共子序列的长度。因此本题本质上与第1143题一模一样。

代码:

cpp 复制代码
class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        //本题等价于求nums1和nums2的最长公共子序列的长度
        int len1 = nums1.size();
        int len2 = nums2.size();
        //i的取值范围是[1,len1]
        //j的取值范围是[1,len2]
        //dp[i][j]表示nums1[0,i-1]和nums2[0,j-1]的最长公共子序列的长度
        //dp[0][j]表示nums1为空,此时不存在公共子序列,dp[0][j]都应该等于0
        //dp[i][0]表示nums2为空,此时不存在公共子序列,dp[i][0]都应该等于0
        //i!=0 且 j!=0时,有两种可能:
        //如果nums1[i-1]等于nums2[j-1],dp[i][j]=dp[i-1][j-1]+1,dp[i][j]由前面的dp[i-1][j-1]覆盖,可以不初始化,或者为了编码方便可以统一初始化为0
        //如果nums1[i-1]不等于nums2[j-1],dp[i][j]=max(dp[i-1][j],dp[i][j-1]),dp[i][j]由前面的dp[i-1][j]或者dp[i][j-1]覆盖,可以不初始化,或者为了编码方便可以统一初始化为0
        vector<vector<int>> dp(len1+1,vector<int>(len2+1,0));
        for(int i = 1;i <= len1;i++){
            for(int j =1;j <= len2;j++){
                if(nums1[i-1] == nums2[j-1])
                    dp[i][j] = dp[i-1][j-1] +1;
                else
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp[len1][len2];
    }
};
相关推荐
z2005093011 小时前
今日算法(二叉搜索树)
学习·leetcode
『昊纸』℃11 小时前
《C语言电子新-2026最新版》-编程语言与程序
数据结构·算法·程序设计·编程语言·软件开发
吃好睡好便好18 小时前
用while循环语句求和
开发语言·学习·算法·matlab·信息可视化
王璐WL18 小时前
【C语言入门级教学】函数的概念2
c语言·数据结构·算法
不知名的忻19 小时前
B 树与 B+ 树:面试完全指南
b树·算法·面试·b+树
运筹vivo@20 小时前
2657. 找到两个数组的前缀公共数组 | 难度:中等
算法·leetcode·职场和发展·哈希表
索木木20 小时前
NCCL SHARP 和 TREE算法
java·服务器·算法
心中有国也有家21 小时前
hccl 架构拆解:昇腾集合通信库到底在做什么?
人工智能·经验分享·笔记·分布式·算法·架构
小O的算法实验室1 天前
2026年MCS,Q-learning增强MOPSO与改进DWA融合算法+复杂三维地形下特定移动机器人动态路径规划
算法
Peter·Pan爱编程1 天前
10. new_delete 不是 malloc_free 的包装
c++·人工智能·算法