热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

两种方法(滑动窗口,DP)解LeetCode水题:最长重复子数组

目录题目解题思路滑动窗口​思路代码结果DP思路代码结果今天下午休息,合租的小伙伴陪女票出去玩了,在家闲来无事就随便刷刷LeetCod

目录

题目

解题思路

滑动窗口

​思路

代码

结果

DP

思路

代码

结果


今天下午休息,合租的小伙伴陪女票出去玩了,在家闲来无事就随便刷刷LeetCode每日一题吧,结果推送给我的是一道难度中等的题,这是在侮辱我的智商吗?可后面的解题过程告诉我,我智商不用它来侮辱也是负数。话不多说,上题目。

题目

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

 

解题思路

一看到这题&#xff0c;我生锈的脑子第一反应就是暴力暴力暴力&#xff0c;暴力的时间复杂度为O(n3)&#xff0c;最后的提交结果也毫无意外地超时了。

言归正传&#xff0c;再仔细阅读了一下题目&#xff0c;“公共的”、“长度最长的”这几个字眼再结合本题&#xff0c;不就在暗示我们用滑动窗口嘛。

滑动窗口

先上1张GIF图便于理解

fig1

 

DP

做完之后看了下题解&#xff0c;发现也可以用动态规划&#xff0c;而且这题用动态规划做还挺简单的&#xff0c;状态转移方程简单得一腿。

思路

令 dp[i][j] 表示 A[i:] 和 B[j:] 的最长公共前缀&#xff0c;那么答案即为所有 dp[i][j] 中的最大值。如果 A[i] &#61;&#61; B[j]&#xff0c;那么 dp[i][j] &#61; dp[i &#43; 1][j &#43; 1] &#43; 1&#xff0c;否则 dp[i][j] &#61; 0。&#xff08;这里借用了 Python 表示数组的方法&#xff0c;A[i:] 表示数组 A 中索引 i 到数组末尾的范围对应的子数组。&#xff09;

考虑到这里 dp[i][j] 的值从 dp[i &#43; 1][j &#43; 1] 转移得到&#xff0c;所以我们需要倒过来&#xff0c;首先计算 dp[len(A) - 1][len(B) - 1]&#xff0c;最后计算 dp[0][0]。

以题目中的输入为例

A: [1,2,3,2,1]
B: [3,2,1,4,7]

状态转移方程为&#xff1a;

若 A[i] !&#61; B[j] &#xff0c; dp[i][j] &#61; 0
若 A[i] &#61;&#61; B[j] &#xff0c; dp[i][j] &#61; dp[i&#43;1][j&#43;1] &#43; 1

动态规划矩阵如下表所示&#xff1a;

 

 32147
100100
201000
330000
202000
100100

结果即为矩阵中的最大值3

代码

public int findLength(int[] A, int[] B) { //动态规划int n &#61; A.length, m &#61; B.length;int[][] dp &#61; new int[n &#43; 1][m &#43; 1];int ans &#61; 0;for (int i &#61; n - 1; i >&#61; 0; i--) {for (int j &#61; m - 1; j >&#61; 0; j--) {dp[i][j] &#61; A[i] &#61;&#61; B[j] ? dp[i &#43; 1][j &#43; 1] &#43; 1 : 0;ans &#61; Math.max(ans, dp[i][j]);}}return ans;}

结果

————————————————————————————————————————

烦躁啊&#xff0c;被疫情搞得左右为难&#xff0c;不知道怎么选择&#xff0c;到底出国还是国内还是HK还是工作&#xff0c;办CAS又被学校卡了&#xff0c;说要提供之前KCL Summer Course的CEFR/RQF Level证明&#xff0c;没有证明也要提供没有证明的证明&#xff0c;英国人办事真的死板&#xff0c;呵呵哒。。


推荐阅读
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • 本文介绍了使用Python根据字典中的值进行排序的方法,并给出了实验结果。通过将字典转化为记录项,可以按照字典中的值进行排序操作。实验结果显示,按照值进行排序后的记录项为[('b', 2), ('a', 3)]。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了多因子选股模型在实际中的构建步骤,包括风险源分析、因子筛选和体系构建,并进行了模拟实证回测。在风险源分析中,从宏观、行业、公司和特殊因素四个角度分析了影响资产价格的因素。具体包括宏观经济运行和宏经济政策对证券市场的影响,以及行业类型、行业生命周期和行业政策对股票价格的影响。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
author-avatar
拍友2602937077
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有