leetcode 718 最长重复子数组
2023-09-27 14:29:24 时间
最长重复子数组
动态规划
- 确定dp数组含义
dp[i][j] :以下标i - 1为结尾的A(A的第i个元素),和以下标j - 1为结尾的B(B的第j个元素),最长重复子数组长度为dp[i][j]。 - 确定递推公式
根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。
即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1; - 初始化
dp[0][0]、dp[i][0]、dp[0][j]都为0,因为下标为0意味着没有元素进行匹配,因此匹配的个数也是0。从dp[i][j]开始有意义,即nums1和nums2都拿出了一个元素
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
//dp数组下标i和j意味着第几个元素,因此长度+1
vector<vector<int>> dp(nums1.size()+1 , vector<int>(nums2.size()+1,0));
int result = 0 ;
for(int i=0 ; i<nums1.size() ;i++)
{
for(int j=0 ;j<nums2.size();j++)
{
if(nums1[i] == nums2[j])
dp[i+1][j+1] = dp[i][j]+1;
if(dp[i+1][j+1] > result) result = dp[i+1][j+1];
}
}
// for(int i=0 ; i<=nums1.size() ;i++)
// {
// for(int j=0 ;j<=nums2.size();j++)
// {
// if(dp[i][j] > result) result = dp[i][j];
// cout<<dp[i][j]<<' ';
// }
// cout<<endl;
// }
return result;
}
};
二刷
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums1.size() , vector<int>(nums2.size(),0));
int result = 0;
for(int i=0 ; i<nums1.size() ; i++)
{
if(nums1[i] == nums2[0]) dp[i][0] = 1;
if(dp[i][0] > result) result = dp[i][0];
}
for(int j=0 ; j<nums2.size() ; j++)
{
if(nums1[0] == nums2[j]) dp[0][j] = 1;
if(dp[0][j] > result) result = dp[0][j];
}
for(int i=1 ; i<nums1.size() ; i++)
{
for(int j=1 ; j<nums2.size() ;j++)
{
if(nums1[i] == nums2[j])
dp[i][j] = dp[i-1][j-1] + 1;
if(dp[i][j] > result) result = dp[i][j];
}
}
// for(int i=0 ; i<nums1.size() ; i++)
// {
// for(int j=0 ; j<nums2.size() ;j++)
// {
// cout<<dp[i][j]<<' ';
// }
// cout<<endl;
// }
return result;
}
};
高刷题
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
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];
}
}
// for(int i=1 ; i <=nums1.size() ; i++)
// {
// for(int j=1 ; j <=nums2.size() ; j++)
// {
// cout<<dp[i][j]<<' ';
// }
// cout<<endl;
// }
return result;
}
};
相关文章
- 【LeetCode】计数质数 [M](素数筛选)
- 【LeetCode】电话号码的字母组合 [M](深度优先遍历)
- 【LeetCode】子数组最小乘积的最大值
- Leetcode 977. 有序数组的平方(亲测可用)
- LeetCode_二分搜索_中等_540.有序数组中的单一元素
- LeetCode_前缀和_哈希表_中等_525.连续数组
- LeetCode_原地修改_简单_448.找到所有数组中消失的数字
- LeetCode_差分数组_中等_1109.航班预订统计
- LeetCode_二分搜索_中等_33.搜索旋转排序数组
- leetcode 190. 颠倒二进制位
- LeetCode刷题(9)【树】前序&深度&平衡(C语言)
- LeetCode刷题(10)【简单】反转整数(C++)
- LeetCode·116.填充每个节点的下一个右侧节点指针·层次遍历
- LeetCode·每日一题·1408.数组中的字符串匹配·模拟
- leetcode刷题练习
- LeetCode------合并两个有序数组(4)【数组】
- LeetCode Merge Two Sorted Lists
- 【LeetCode从零单排】No19.RemoveNthNodeFromEndofList
- LeetCode || Copy List with Random Pointer
- leetcode——Search for a Range 排序数组中寻找目标下标范围(AC)
- LeetCode-409. 最长回文串(Goland实现)
- [LeetCode] 805. Split Array With Same Average 用相同均值拆分数组
- [LeetCode] 890. Find and Replace Pattern 查找和替换模式
- [LeetCode] 360. Sort Transformed Array 排序转换后的数组
- [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写
- [LeetCode] 53. Maximum Subarray 最大子数组
- [LeetCode] 309. Best Time to Buy and Sell Stock with Cooldown 买卖股票的最佳时间有冷却期
- leetcode 977 有序数组的平方
- leetcode 209 长度最小的子数组