[Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]

【问题描述】[中等]

给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例 1:输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出: 3
解释: 
长度最长的公共子数组是 [3, 2, 1]。
说明:1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100

【解答思路】

1. 暴力法

时间复杂度:O(N^3) 空间复杂度:O(1)
在这里插入图片描述

public int findLength1(int[] numa, int[] numb) {if(numa == null || numb ==null){return 0;}int max = 0;int aLen = numa.length, bLen = numb.length;int aIndex, bIndex, sameLen;for(int i=0; i<aLen; i++){for(int j=0; j<bLen; j++){aIndex = i;bIndex = j;sameLen = 0;while(aIndex<aLen && bIndex<bLen && numa[aIndex]==numb[bIndex] ){sameLen++;aIndex++;bIndex++;}if(max < sameLen){max = sameLen;}}}return max;}
2. 动态规划

在这里插入图片描述
第 1 步:设计状态
int[][] dp 表示 A[i:] 和 B[j:] 的最长公共前缀
第 2 步:状态转移方程
如果 A[i] == B[j],那么 dp[i][j] = dp[i + 1][j + 1] + 1,否则 dp[i][j] = 0。
第 3 步:考虑初始化
int[][] dp = new int[n + 1][m + 1];
第 4 步:考虑输出 max
第 5 步:考虑是否可以状态压缩 暂时不考虑

时间复杂度:O(N×M) 空间复杂度:O(N×M)
在这里插入图片描述

class Solution {public int findLength(int[] A, int[] B) {int n = A.length, m = B.length;int[][] dp = new int[n + 1][m + 1];int ans = 0;for (int i = n - 1; i >= 0; i--) {for (int j = m - 1; j >= 0; j--) {dp[i][j] = A[i] == B[j] ? dp[i + 1][j + 1] + 1 : 0;ans = Math.max(ans, dp[i][j]);}}return ans;}
}
 public int findLength(int[] A, int[] B) {int lenA = A.length;int lenB = B.length;int[][] dp = new int[lenA][lenB];int max = Integer.MIN_VALUE;for (int i = 0; i < lenA; i++) {for (int j = 0; j < lenB; j++) {if (A[i] == B[j]){if (i > 0 && j > 0){dp[i][j] =  dp[i - 1][j - 1] + 1;}else{dp[i][j] = 1;}}max = Math.max(max,dp[i][j]);}}return max;}
3. 滑动窗口

在这里插入图片描述
时间复杂度:O((N+M)×min(N,M)) 空间复杂度:O(1)
在这里插入图片描述

class Solution {public int findLength(int[] A, int[] B) {int n = A.length, m = B.length;int ret = 0;for (int i = 0; i < n; i++) {int len = Math.min(m, n - i);int maxlen = maxLength(A, B, i, 0, len);ret = Math.max(ret, maxlen);}for (int i = 0; i < m; i++) {int len = Math.min(n, m - i);int maxlen = maxLength(A, B, 0, i, len);ret = Math.max(ret, maxlen);}return ret;}public int maxLength(int[] A, int[] B, int addA, int addB, int len) {int ret = 0, k = 0;for (int i = 0; i < len; i++) {if (A[addA + i] == B[addB + i]) {k++;} else {k = 0;}ret = Math.max(ret, k);}return ret;}
}

【总结】

1. 暴力法 注意边界问题
2.动态规划 做到前四就不错啦

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩

3.滑动窗口 还可以是两个块之间对比使用 之前都是用双指针滑的

转载链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/solution/zui-chang-zhong-fu-zi-shu-zu-by-leetcode-solution/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeForces 841C (C) Leha and Function 贪心

题意 定义F(n,k)表示&#xff11;&#xff0d;&#xff4e;的数列中以&#xff4b;为子集总个数的最小值 现有&#xff21;&#xff0c;&#xff22;数组 让我们重新排列&#xff21; 使得sigma[1 len]F(ai,bi)的数学期望最大 分析 题目看上去有点绕 但从期望上分析下其…

技术方法论

1、pom.xml配置新版本的jar包&#xff0c;如果引用不到可以先删除本地仓库的jar包&#xff0c;从私服重新下载新版本 转载于:https://www.cnblogs.com/luao/p/10535817.html

CodeForces 841B (B) 博弈

题意 定义&#xff21;把取数列中区间和为奇数的元素取出来 &#xff22;把数列中区间长度为偶数的区间删除 那么谁先面临无数可拿的局面为输 输出赢家 &#xff21;先取 分析 分析可知本题如果区间中每一个数是偶数那么&#xff22;可以一次取完 则&#xff21;不能取…

[剑指offer]面试题第[53-1]题[JAVA][在排序数组中查找数字-1][二分法][暴力法]

【问题描述】[中等] 统计一个数字在排序数组中出现的次数。 示例 1:输入: nums [5,7,7,8,8,10], target 8 输出: 2 示例 2:输入: nums [5,7,7,8,8,10], target 6 输出: 0【解答思路】 1. 暴力法/遍历 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) public int…

luogu P3295 [SCOI2016]萌萌哒

传送门 题目条件"两个子串\(S[l_1,r_1],S[l_2,r_2]\)完全相同"等价于\(\forall i \in[0,r_1-l_11],S_{l1i}S_{l_2i}\),然后所有相同位置的都要选一种数字,把所有相同的放在一个集合,然后记集合个数为\(cn\)那么答案就是\(9*10^{cn-1}\),因为第一位不为0,然后就可以暴…

CodeForces - 888C K-Dominant Character 思维

题意 找到在整个字符串中 所有以&#xff4b;长度的子串中的公共串至少长度为&#xff11;的字符串 求出这个&#xff2b;的最小值是多少  分析 每个子串都有的至少长度为&#xff11;的公共子串 这里我们要求&#xff4b;的最小 那么不如就把公共串的长度考虑为&#…

[剑指offer]面试题第[53-2]题[JAVA][0-n-1中缺失的数字][二分法][暴力法]

【问题描述】[简单] 一个长度为n-1的递增排序数组中的所有数字都是唯一的&#xff0c;并且每个数字都在范围0&#xff5e;n-1之内。在范围0&#xff5e;n-1内的n个数字中有且只有一个数字不在该数组中&#xff0c;请找出这个数字。示例 1:输入: [0,1,3] 输出: 2 示例 2:输入: …

过拟合问题详解

具体内容来自于读芯术&#xff1a;https://mp.weixin.qq.com/s?__bizMzI2NjkyNDQ3Mw&mid2247487002&idx1&sn05d13bd67a31e38434285c5f0262b95d&chksmea87f6ccddf07fdae17a71819ba0577d099bb49b291093e7c6c7927456febfb3d8d308c30ad6&scene21#wechat_redir…

Crusaders Quest ZOJ - 3983 构造|思维

题意 给我们一个字符串 其中只有a,o,g 当三个相同字符连在一起时释放大技能 我们可以消除任意连续数量的字符  问我们最大的释放大技能的数量是多少 分析 首先答案只能是 &#xff11; &#xff12; &#xff13; 如果这个字符串中存在连续三个的我们可以直接消去 …

[Leetcode][第378题][JAVA][有序矩阵中第K小的元素][二分法][归并排序][暴力]

【问题描述】[中等] 给定一个 n x n 矩阵&#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是排序后的第 k 小元素&#xff0c;而不是第 k 个不同的元素。示例&#xff1a; matrix [[ 1, 5, 9],[10, 11, 13],[12, 13…

设计模式-Builder和Factory模式区别

Builder和Factory模式区别 Builder模式结构&#xff1a; Factory模式一进一出,Builder模式是分步流水线作业。当你需要做一系列有序的工作或者按照一定的逻辑来完成创建一个对象时 Builder就派上用场啦。我们可以看到&#xff0c;Builer模式与工厂模式是极为相似的&#xff0c;…

CodeForces - 766C - Mahmoud and a Message dp

题意 给出一个字符串 和每个字符的限制数量ai 让我们随意的切割成多个字符串 使得每一个字符串中的特定字符所在的子串长度len<ai 求一共有多少个符合题目要求的方案 求其中最长的一个串长度是多少 求其中最少能分成多少个串 长度最大为1000 分析 明显可以用搜索 不过复…

[剑指offer]面试题第[54]题[JAVA][二叉搜索树的第k大节点][递归][迭代]

【问题描述】[简单] 给定一棵二叉搜索树&#xff0c;请找出其中第k大的节点。示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4 示例 2:输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出: 4【解答思路】 反向中序遍历 遍历到第k个节点时&…

Hihocoder 1632 : Secret Poems 思维|技巧

题意 定义一个矩阵 他有n*n大小 然后给出他的真实信息的走法 让我们变换走法 再次把真实信息填入矩阵中 n<100 分析 可以发现原文的读取方式无非就是如此 &#xff08;0,1&#xff09;向左 (1,-1)左下 (1,0)向下 (-1,1)右上 1边界检查 (1,0)向下 (1,-1)左下 (0,…

[Leetcode][第108题][JAVA][将有序数组转换为二叉搜索树][二分法][递归]

【问题描述】[简单] 将一个按照升序排列的有序数组&#xff0c;转换为一棵高度平衡二叉搜索树。本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是&#xff1a;[0,-3…

CF Vicious Keyboard 构造水题

题目说 在给定字符串中 只能改变一个字符的情况下 求最大的VK字符的数量 分析 为了防止出错 这里要注意 为了防止VK判断的时候 不影响其他的判断 对于一个VK 我们最好不要把他删掉删掉后有可能会增加新的VK 就直接用特定值把原来的VK覆盖掉 然后对于剩下的可能 最多只能增…

数据结构:(1)课程总览

“数据结构”课程的内容 “数据结构”在计算机课程体系&#xff08;偏软&#xff09;中的地位 “数据结构”与程序设计类课程的关系 “数据结构”的学习目标 “数据结构”的学习方法