【问题描述】[中等]

给两个整数数组 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/

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

  1. [Leetcode][第32题][JAVA][最长有效括号][动态规划][栈][正向逆向结合]

    [问题描述][困难] 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度.示例 1:输入: "(()" 输出: 2 解释: 最长有效括号子串为 &qu ...

  2. LeetCode·718.最长重复子数组·动态规划

    链接:https://leetcode.cn/problems/maximum-length-of-repeated-subarray/solution/-by-xun-ge-v-5he0/ 来源:力 ...

  3. leetcode 424. 替换后的最长重复字符(滑动窗口)

    给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 注意:字符串长度 和 k 不会超过 104 ...

  4. 115. Leetcode 718. 最长重复子数组 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]表示的是长度为i的A数组和长度为j的B数组公共的长度最长的子数组的长 度. 步骤二.推断状态方程: 考虑下dp[i][j], 因为这里的子数 ...

  5. [Leetcode][第1143题][JAVA][最长公共子序列][LCS][动态规划]

    [问题描述][中等] [解答思路] 时间复杂度:O(N^2) 空间复杂度:O(N^2) class Solution {public int longestCommonSubsequence(Stri ...

  6. [Leetcode][第315题][JAVA][计算右侧小于当前元素的个数][暴力][归并排序+索引数组]

    [问题描述][中等] [解答思路] 1. 暴力 (超时) 时间复杂度:O(N^2) 空间复杂度:O(1) public List<Integer> countSmaller(int[] n ...

  7. [Leetcode][第546题][JAVA][移除盒子][递归][动态规划]

    [问题描述][困难] [解答思路] 1. 递归 动态规划 class Solution {public int removeBoxes(int[] boxes) {int[][][] dp = new ...

  8. [Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]

    [问题描述][中等] [解答思路] 1. 动态规划思路一 自上而下 第 1 步:设计状态 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和 位置(i,j) 指的是三角形中第 i 行第 ...

  9. [剑指offer]面试题第[63]题[Leetcode][第121题][JAVA][买卖股票的最佳时机][动态规划][暴力]

    [问题描述][简单] [解答思路] 1. 暴力 时间复杂度:O(N^2) 空间复杂度:O(1) public class Solution {public int maxProfit(int pric ...

最新文章

  1. Python之Python 安装环境搭建
  2. MySQL会回收使用中的连接吗_Node.js实现mysql连接池使用事务自动回收连接的方法示例...
  3. HDU6184【Counting Stars】(三元环计数)
  4. 20145231 《信息安全系统设计基础》期中总结
  5. excel办公常用的宏_让领导看傻!精美168套办公常用excel模板免费领
  6. php-fpm进程的用户组,PHP中的“进程”系列1——PHP-FPM模型
  7. java零碎要点009---java实现服务器心跳机制,TCP握手
  8. 虚拟大师怎么修改手机_手机虚拟大师,打造一个属于你的专属手机平台
  9. Csdn Blog 开发团队致广大网友的一封信
  10. 2021-08-02 INSERT INTO插入语句
  11. linux 终端 快捷键
  12. 京东评价系统更新190301
  13. 无损压缩——Huffman编码
  14. java 中文分词转拼音_Java实现将汉字转化为汉语拼音的方法
  15. Xcode8使用出现bundleid: com.jd.***, enable_level: 0, persist_level: 0, propagate_with_acti
  16. pytorch 支持amd显卡吗_2020-06-12 ubuntu系统下,pytorch安装
  17. 【NLP】文本分类TorchText实战-AG_NEWS 新闻主题分类任务(PyTorch版)
  18. django 异步_Django和异步支持:永无止境的故事
  19. Docker 服务无缝对接部署方案
  20. 编写Android app更新模块遇到的问题分析与总结

热门文章

  1. install kinect driver for ARM---38
  2. Mybatis日常操作遇到的问题
  3. zuul 1.x 和gateway性能对比
  4. 如何关闭线程池?会创建不会关闭?调用关闭方法时线程池里的线程如何反应?
  5. Android Notification 手机系统横幅弹出提示框调用,横幅通知,RemoteViews使用实例
  6. zsh: command not found: service
  7. js Ajax跨域访问
  8. linux sha1sum命令,讲解Linux中校验文件的MD5码与SHA1码的命令使用
  9. html的post和get请求参数,HTTP 方法:GET 对比 POST | w3cschool菜鸟教程
  10. c++电费管理系统_能耗管理系统