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];
    }
};
相关推荐
岁忧3 分钟前
(LeetCode 面试经典 150 题) 200. 岛屿数量(深度优先搜索dfs || 广度优先搜索bfs)
java·c++·leetcode·面试·go·深度优先
一枝小雨11 分钟前
【OJ】C++ vector类OJ题
数据结构·c++·算法·leetcode·oj题
Tisfy22 分钟前
LeetCode 3516.找到最近的人:计算绝对值大小
数学·算法·leetcode·题解
自信的小螺丝钉23 分钟前
Leetcode 206. 反转链表 迭代/递归
算法·leetcode·链表
黑色的山岗在沉睡1 小时前
LeetCode 189. 轮转数组
java·算法·leetcode
墨染点香1 小时前
LeetCode 刷题【65. 有效数字】
算法·leetcode·职场和发展
Tisfy1 小时前
LeetCode 3027.人员站位的方案数 II:简单一个排序O(n^2)——ASCII图解
leetcode·题解·思维·排序·hard
源代码•宸2 小时前
Leetcode—2749. 得到整数零需要执行的最少操作数【中等】(__builtin_popcountl)
c++·经验分享·算法·leetcode·位运算
用户4822137167752 小时前
深度学习——AlexNet网络结构
算法