leetcode代码提交格式,leetcode medium是什么意思

  leetcode代码提交格式,leetcode medium是什么意思

  主题https://莉特code.com/problems/maximum-length-of-repeated-subarray/

  Topic给出两个整数数组A和B,返回两个数组的最长公共子数组的长度。(最长公共子串问题)

  示例输入:

  答案:[1,2,3,2,1]

  乙:[三,二,一,四,七]

  输出:3

  最长公共子序列是[3,2,1]

  解决思路一计算多个子数组的最长公共前缀的长度(最长公共部分数组可以设置任意项为起始项或者最长公共部分数组可以设置任意项为结束项),最后得到这两个数组的值。

  这个问题满足动态规划算法的三个适用条件:

  1)求一个问题的最优解。

  )问题可以分成几个子问题,子问题之间又有更小的子问题相互重叠;(可以通过遍历两个指定的数组来反汇编分子数组。计算的子阵列也包括具有较短计算长度的子阵列。)

  3)这个问题的最优解依赖于子问题的最优解。)可以计算分段排列对的最长公共前缀的长度,求最大值,得到结果。)

  所以这个问题可以在动态规划解决。

  (1)第一种更新方法)dp[i][j]定义为A[i:]和B[j:]的最长公共前缀的长度。其中,区间A[i]到A[-1]形成的子数组是指A[i:]或b[j3360]的二维数组从右下角更新到左上角。如果A[i]==B[j],则更新dp[i][j]=dp[i 1][j 1] 1。即根据A[i 1:]和B[j 1:]的最长公共前缀添加元素。如果一个[我]!=B[j],dp[i][j]=0 .Python实现代码如下:

  类解3360 deffindlength (self,A: List[int],A: List[int]) (int: m,n=map(len,b) DP=[ 0f or]因为后续的DP(m-1)) n-1更新使用了DP,所以-1) -1]forjinrange(n-1,-1,-1):# I-1]IFA[I]==B[J]33660=B[J]is DP[I][J]=DP[I1][J1]1 max _ length=maxPython实现代码如下。

  类解3360 deffindlength (self,A: List[int],A: List[int] ) (int : m,n=map(len,B)DP=[0 for _ in range(n1)]for _ in range(m1)#一般动态调度的大小为(m1)* n1)Max _ length=0 for I in range(1)一般动态调度的大小为n ^ 1):# J)表示J的获取范围为[1,n],表示B排列的索引获取。

  因为dp[i][j]只与dp[i 1][j 1]或dp[i-1][j-1]相关,所以可以进一步降低复杂度。

  使用一维数组存储状态。

  方案二:通过观察发现,重复的子阵列在两个阵列中的位置可能不同。然后,在我们知道了重复子数组的起始位置之后,就可以根据它来对齐数组A和B,然后,从第一个对齐的元素开始,遍历比较两个数组,得到重复子数组的长度。b .两个阵列的所有对准包括两种:

  (1)A不移动,B移动使数组B的第一个元素B[0]与A中的元素一一对齐;

  (2)B不移动,A移动使数组A的第一个元素A[0]与B中的元素一一对齐。

  例如,数组A: [1,2,3]和B: [4,5,6,7]可以按以下方式对齐:

  橙色元素是第一个对齐的元素,红色框架是需要逐个比较的元素。

  一个优化点是,如果要比较的元素个数(红框中的元素个数)小于存储当前最长重复子数组长度的tmp_max,可以直接跳出当前循环。因为当前循环计算的重复子数组的长度小于或等于红框中要比较的元素个数,所以必须小于tmp_max。同时,随着I的增加,长度会越来越小,可以直接使用break语句。

  Python实现了class solution:def find length(self,a: list [int],B:list[int])-int:def gettmpcommon(start _ A,start _ b,length):tmp _ max=Count=0 for I in range(length):if(A[start _ A I]==B[start _ B I]):Count=1 tmp _ max=max(tmp _ max,Count) else: count=0 #中间有一个元素是不同的。count需要重置为0,但当前连续重复元素的最大数量保存在tmp_max中。返回tmp _ max m,n=len (a),len (b) tmp _ max=0对于范围(m)内的I:# b不移动,a移动并对齐。A[i]和B[0]是第一个对齐元素length=min(m-i,n)#对齐长度是m-i,n的最小值(红框中的元素个数)if(length tmp_max): #如果要比较的红框中的元素个数小于tmp_max,那么比较就没有意义了,因为getTmpCommon得到的结果一定比tmp好。所以用break代替continue break tmp _ max=max(tmp _ max,gettmpcommon (I,0,length)) #更新范围(n)内I的tmp _ max:# A不移动,b移动对齐。B[i]和A[0]是第一个对齐元素length=min(n-i,m)#对齐长度为n-i,m的最小值(红框中的元素个数)if(length tmp_max): #如果要比较的红框中的元素个数小于tmp_max,那么这一轮比较就没有意义了,因为getTmpCommon得到的结果一定比其他的好。Break _ max=max (tmp _ max,gettmpcommon,I,length))返回tmp _ max Idea 2的时间复杂度为O((m n)*min(m,n)),空间复杂度为O(1)。

  解决方案3另外,还有一种结合二分搜索法和mgdds的解决方案,可以进一步降低时间复杂度。请参考参考文献中的官方解决方案,有时间在博文中描述一下。

  参考官方解决方案

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: